【问题标题】:How do I create a list of random numbers without duplicates?如何创建不重复的随机数列表?
【发布时间】:2012-04-03 01:47:32
【问题描述】:

我尝试使用random.randint(0, 100),但有些数字是相同的。是否有创建唯一随机数列表的方法/模块?

注意:以下代码基于一个答案,并且是在发布答案后添加的。这不是问题的一部分;这是解决方案。

def getScores():
    # open files to read and write
    f1 = open("page.txt", "r");
    p1 = open("pgRes.txt", "a");

    gScores = [];
    bScores = [];
    yScores = [];

    # run 50 tests of 40 random queries to implement "bootstrapping" method 
    for i in range(50):
        # get 40 random queries from the 50
        lines = random.sample(f1.readlines(), 40);

【问题讨论】:

  • 如果它们是独一无二的,它们在正确的上下文中可以是真正随机的。就像一个没有替换的随机索引样本仍然可以是完全随机的。

标签: python random


【解决方案1】:

这将返回从 0 到 99 范围内选择的 10 个数字的列表,没有重复。

import random
random.sample(range(100), 10)

参考您的特定代码示例,您可能希望读取文件中的所有行一次,然后从内存中保存的列表中选择随机行。例如:

all_lines = f1.readlines()
for i in range(50):
    lines = random.sample(all_lines, 40)

这样,您只需要在循环之前从文件中实际读取一次。这样做比回溯到文件的开头并在每次循环迭代时再次调用f1.readlines() 效率更高。

【讨论】:

  • 这种技术会浪费内存,尤其是对于大样本。我在下面发布了使用线性同余生成器的内存和计算效率更高的解决方案的代码。
  • 有人向我指出,LCG 方法虽然不太“随机”,所以如果你想生成许多独特的随机序列,多样性会比这个解决方案少。如果您只需要少量随机序列,LCG 就是您的最佳选择!
  • numpy 而不是 random 似乎更快。 import numpy as np; np.random.permutation(100)[:10] 还生成从 0 到 99 中选择的 10 个数字,没有重复。在 IPython 中进行基准测试,%timeit random.sample(range(1000), 100) 产生 103 µs ± 513 ns,%timeit np.random.permutation(1000)[:100] 产生 17 µs ± 1.24 µs。
【解决方案2】:

您可以像这样使用 random 模块中的 shuffle 函数:

import random

my_list = list(xrange(1,100)) # list of integers from 1 to 99
                              # adjust this boundaries to fit your needs
random.shuffle(my_list)
print my_list # <- List of unique random numbers

请注意,shuffle 方法不会像预期的那样返回任何列表,它只会对通过引用传递的列表进行打乱。

【讨论】:

  • 这里值得一提的是,xrange 仅在 Python 2 中有效,在 Python 3 中无效。
【解决方案3】:

您可以先创建一个从ab 的数字列表,其中ab 分别是列表中的最小和最大数字,然后使用Fisher-Yates 算法或使用Python 的random.shuffle 方法。

【讨论】:

  • 生成完整的索引列表会浪费内存,尤其是对于大样本。我在下面发布了使用线性同余生成器的内存和计算效率更高的解决方案的代码。
  • 对象没有“样本”属性
【解决方案4】:

this answer 中提出的解决方案有效,但如果样本量小但人口众多(例如 random.sample(insanelyLargeNumber, 10)),它可能会出现内存问题。

要解决这个问题,我会这样做:

answer = set()
sampleSize = 10
answerSize = 0

while answerSize < sampleSize:
    r = random.randint(0,100)
    if r not in answer:
        answerSize += 1
        answer.add(r)

# answer now contains 10 unique, random integers from 0.. 100

【讨论】:

  • 现在random.sample 将这种方法用于大量样本中的少量样本,因此这个内存问题不再存在。尽管在编写此答案时,random.shuffle 的实现可能有所不同。
【解决方案5】:

线性同余伪随机数生成器

O(1) 内存

O(k) 次操作

这个问题可以通过一个简单的Linear Congruential Generator 来解决。这需要恒定的内存开销(8 个整数)和最多 2*(序列长度)的计算。

所有其他解决方案都使用更多内存和更多计算!如果你只需要几个随机序列,这种方法会便宜很多。对于N 的大小范围,如果您想按N 的顺序生成唯一的k-sequences 或更多,我推荐使用内置方法random.sample(range(N),k) 的公认解决方案,因为python 中的has been optimized 以提高速度.

代码

# Return a randomized "range" using a Linear Congruential Generator
# to produce the number sequence. Parameters are the same as for 
# python builtin "range".
#   Memory  -- storage for 8 integers, regardless of parameters.
#   Compute -- at most 2*"maximum" steps required to generate sequence.
#
def random_range(start, stop=None, step=None):
    import random, math
    # Set a default values the same way "range" does.
    if (stop == None): start, stop = 0, start
    if (step == None): step = 1
    # Use a mapping to convert a standard range into the desired range.
    mapping = lambda i: (i*step) + start
    # Compute the number of numbers in this range.
    maximum = (stop - start) // step
    # Seed range with a random integer.
    value = random.randint(0,maximum)
    # 
    # Construct an offset, multiplier, and modulus for a linear
    # congruential generator. These generators are cyclic and
    # non-repeating when they maintain the properties:
    # 
    #   1) "modulus" and "offset" are relatively prime.
    #   2) ["multiplier" - 1] is divisible by all prime factors of "modulus".
    #   3) ["multiplier" - 1] is divisible by 4 if "modulus" is divisible by 4.
    # 
    offset = random.randint(0,maximum) * 2 + 1      # Pick a random odd-valued offset.
    multiplier = 4*(maximum//4) + 1                 # Pick a multiplier 1 greater than a multiple of 4.
    modulus = int(2**math.ceil(math.log2(maximum))) # Pick a modulus just big enough to generate all numbers (power of 2).
    # Track how many random numbers have been returned.
    found = 0
    while found < maximum:
        # If this is a valid value, yield it in generator fashion.
        if value < maximum:
            found += 1
            yield mapping(value)
        # Calculate the next value in the sequence.
        value = (value*multiplier + offset) % modulus

用法

这个函数“random_range”的用法与任何生成器的用法相同(如“range”)。一个例子:

# Show off random range.
print()
for v in range(3,6):
    v = 2**v
    l = list(random_range(v))
    print("Need",v,"found",len(set(l)),"(min,max)",(min(l),max(l)))
    print("",l)
    print()

样本结果

Required 8 cycles to generate a sequence of 8 values.
Need 8 found 8 (min,max) (0, 7)
 [1, 0, 7, 6, 5, 4, 3, 2]

Required 16 cycles to generate a sequence of 9 values.
Need 9 found 9 (min,max) (0, 8)
 [3, 5, 8, 7, 2, 6, 0, 1, 4]

Required 16 cycles to generate a sequence of 16 values.
Need 16 found 16 (min,max) (0, 15)
 [5, 14, 11, 8, 3, 2, 13, 1, 0, 6, 9, 4, 7, 12, 10, 15]

Required 32 cycles to generate a sequence of 17 values.
Need 17 found 17 (min,max) (0, 16)
 [12, 6, 16, 15, 10, 3, 14, 5, 11, 13, 0, 1, 4, 8, 7, 2, ...]

Required 32 cycles to generate a sequence of 32 values.
Need 32 found 32 (min,max) (0, 31)
 [19, 15, 1, 6, 10, 7, 0, 28, 23, 24, 31, 17, 22, 20, 9, ...]

Required 64 cycles to generate a sequence of 33 values.
Need 33 found 33 (min,max) (0, 32)
 [11, 13, 0, 8, 2, 9, 27, 6, 29, 16, 15, 10, 3, 14, 5, 24, ...]

【讨论】:

  • 这很酷!但我确信它确实回答了这个问题;假设我想从 0 到 4 采样 2 个值。在不生成我自己的 prime 的情况下,该函数只会返回 4 个可能的答案,因为 value 是唯一随机选择的具有 4 个可能值的东西,当我们至少需要时(4 选择 2)= 6,(允许非随机排序)。 random_range(2,4) 将返回值 {(1, 0), (3, 2), (2, 1), (0, 3)},但绝不会返回值对 (3,1)(或 (1,3))。您是否期望每个函数调用都有新的随机生成的大素数?
  • (另外我假设你希望人们在你的函数返回序列后随机排序,因为random_range(v) 最多返回v 唯一序列而不是v! )
  • 完全正确!很难在避免整数溢出和生成足够多的随机序列之间取得平衡。我更新了函数以包含更多的随机性,但它仍然不如 v! 那样随机。这取决于您是否要多次使用该功能。当您从大范围的值生成时(当其他人的内存消耗会高得多时),最好使用此解决方案。我再考虑一下,谢谢!
【解决方案6】:

如果从1到N的N个数字的列表是随机生成的,那么是的,有一些数字可能会重复。

如果您想要以随机顺序排列从 1 到 N 的数字列表,请使用从 1 到 N 的整数填充数组,然后使用 Fisher-Yates shuffle 或 Python 的 random.shuffle()

【讨论】:

    【解决方案7】:

    如果您需要对非常大的数字进行采样,则不能使用range

    random.sample(range(10000000000000000000000000000000), 10)
    

    因为它会抛出:

    OverflowError: Python int too large to convert to C ssize_t
    

    另外,如果random.sample 由于范围太小而无法生成您想要的项目数

     random.sample(range(2), 1000)
    

    它抛出:

     ValueError: Sample larger than population
    

    这个函数解决了这两个问题:

    import random
    
    def random_sample(count, start, stop, step=1):
        def gen_random():
            while True:
                yield random.randrange(start, stop, step)
    
        def gen_n_unique(source, n):
            seen = set()
            seenadd = seen.add
            for i in (i for i in source() if i not in seen and not seenadd(i)):
                yield i
                if len(seen) == n:
                    break
    
        return [i for i in gen_n_unique(gen_random,
                                        min(count, int(abs(stop - start) / abs(step))))]
    

    使用非常大的数字:

    print('\n'.join(map(str, random_sample(10, 2, 10000000000000000000000000000000))))
    

    示例结果:

    7822019936001013053229712669368
    6289033704329783896566642145909
    2473484300603494430244265004275
    5842266362922067540967510912174
    6775107889200427514968714189847
    9674137095837778645652621150351
    9969632214348349234653730196586
    1397846105816635294077965449171
    3911263633583030536971422042360
    9864578596169364050929858013943
    

    范围小于请求项数的用法:

    print(', '.join(map(str, random_sample(100000, 0, 3))))
    

    示例结果:

    2, 0, 1
    

    它也适用于负范围和步骤:

    print(', '.join(map(str, random_sample(10, 10, -10, -2))))
    print(', '.join(map(str, random_sample(10, 5, -5, -2))))
    

    示例结果:

    2, -8, 6, -2, -4, 0, 4, 10, -6, 8
    -3, 1, 5, -1, 3
    

    【讨论】:

    • 如果你生成超过 80 亿个数字,迟早会变得太大
    • 这个答案对于大样本有一个严重的缺陷。碰撞的概率随着每一步线性增长。我发布了一个使用线性同余生成器的解决方案,它具有 O(1) 内存开销和 O(k) 生成 k 数字所需的步骤。这可以更有效地解决!
    • “这个函数解决了两个问题” 它是如何解决第二个问题的?您仍然不能从 2 的总体中抽取 1000 个样本。而不是抛出异常,您会产生不正确的结果;这几乎不能解决“问题”(这实际上不是问题,因为从 n )。
    【解决方案8】:

    这是我做的一个很小的函数,希望对你有帮助!

    import random
    numbers = list(range(0, 100))
    random.shuffle(numbers)
    

    【讨论】:

      【解决方案9】:

      您可以使用 Numpy 库进行快速回答,如下所示 -

      给定代码 sn-p 列出了 0 到 5 之间的 6 个唯一数字。您可以根据自己的舒适度调整参数。

      import numpy as np
      import random
      a = np.linspace( 0, 5, 6 )
      random.shuffle(a)
      print(a)
      

      输出

      [ 2.  1.  5.  3.  4.  0.]
      

      它没有像我们在 random.sample 中看到的那样设置任何约束,称为 here

      希望这会有所帮助。

      【讨论】:

      • 这些数字是均匀分布的,所以完全不是随机的。
      【解决方案10】:

      一个非常简单的函数也解决了你的问题

      from random import randint
      
      data = []
      
      def unique_rand(inicial, limit, total):
      
              data = []
      
              i = 0
      
              while i < total:
                  number = randint(inicial, limit)
                  if number not in data:
                      data.append(number)
                      i += 1
      
              return data
      
      
      data = unique_rand(1, 60, 6)
      
      print(data)
      
      
      """
      
      prints something like 
      
      [34, 45, 2, 36, 25, 32]
      
      """
      

      【讨论】:

        【解决方案11】:

        here 提供的答案在时间方面效果很好 以及内存,但由于它使用高级 python 有点复杂 产量等结构。 simpler answer 在实践中效果很好,但是问题在于 答案是它可能会在实际构造之前生成许多虚假整数 所需的集合。尝试使用 populationSize = 1000,sampleSize = 999。 理论上,它有可能不会终止。

        下面的答案解决了这两个问题,因为它是确定性的并且有些有效 虽然目前不如其他两个高效。

        def randomSample(populationSize, sampleSize):
          populationStr = str(populationSize)
          dTree, samples = {}, []
          for i in range(sampleSize):
            val, dTree = getElem(populationStr, dTree, '')
            samples.append(int(val))
          return samples, dTree
        

        getElem、percolateUp 函数定义如下

        import random
        
        def getElem(populationStr, dTree, key):
          msd  = int(populationStr[0])
          if not key in dTree.keys():
            dTree[key] = range(msd + 1)
          idx = random.randint(0, len(dTree[key]) - 1)
          key = key +  str(dTree[key][idx])
          if len(populationStr) == 1:
            dTree[key[:-1]].pop(idx)
            return key, (percolateUp(dTree, key[:-1]))
          newPopulation = populationStr[1:]
          if int(key[-1]) != msd:
            newPopulation = str(10**(len(newPopulation)) - 1)
          return getElem(newPopulation, dTree, key)
        
        def percolateUp(dTree, key):
          while (dTree[key] == []):
            dTree[key[:-1]].remove( int(key[-1]) )
            key = key[:-1]
          return dTree
        

        最后,如下图所示,对于较大的 n 值,平均时间约为 15ms,

        In [3]: n = 10000000000000000000000000000000
        
        In [4]: %time l,t = randomSample(n, 5)
        Wall time: 15 ms
        
        In [5]: l
        Out[5]:
        [10000000000000000000000000000000L,
         5731058186417515132221063394952L,
         85813091721736310254927217189L,
         6349042316505875821781301073204L,
         2356846126709988590164624736328L]
        

        【讨论】:

        • 你觉得that的答案很复杂?那这是什么?!然后是other answer,它会生成许多“虚假整数”。我使用您提供的示例输入(populationSize = 1000,sampleSize = 999)运行了您的实现。您的版本调用 random.randint 函数 3996 次,而另一个 cca. 6000 次。进步不大吧?
        • @kyrill,你对this answer的看法
        【解决方案12】:

        为了获得一个程序,该程序生成一个没有重复的随机值列表,它是确定性的、高效的并使用基本的编程结构构建,请考虑下面定义的函数extractSamples

        def extractSamples(populationSize, sampleSize, intervalLst) :
            import random
            if (sampleSize > populationSize) :
                raise ValueError("sampleSize = "+str(sampleSize) +" > populationSize (= " + str(populationSize) + ")")
            samples = []
            while (len(samples) < sampleSize) :
                i = random.randint(0, (len(intervalLst)-1))
                (a,b) = intervalLst[i]
                sample = random.randint(a,b)
                if (a==b) :
                    intervalLst.pop(i)
                elif (a == sample) : # shorten beginning of interval                                                                                                                                           
                    intervalLst[i] = (sample+1, b)
                elif ( sample == b) : # shorten interval end                                                                                                                                                   
                    intervalLst[i] = (a, sample - 1)
                else :
                    intervalLst[i] = (a, sample - 1)
                    intervalLst.append((sample+1, b))
                samples.append(sample)
            return samples
        

        基本思想是跟踪间隔intervalLst 以获取从中选择所需元素的可能值。这是确定性的,因为我们保证在固定数量的步骤内生成样本(仅取决于populationSizesampleSize)。

        要使用上面的函数来生成我们需要的列表,

        In [3]: populationSize, sampleSize = 10**17, 10**5
        
        In [4]: %time lst1 = extractSamples(populationSize, sampleSize, [(0, populationSize-1)])
        CPU times: user 289 ms, sys: 9.96 ms, total: 299 ms
        Wall time: 293 ms
        
        

        我们还可以与早期的解决方案进行比较(对于较低的 populationSize 值)

        In [5]: populationSize, sampleSize = 10**8, 10**5
        
        In [6]: %time lst = random.sample(range(populationSize), sampleSize)
        CPU times: user 1.89 s, sys: 299 ms, total: 2.19 s
        Wall time: 2.18 s
        
        In [7]: %time lst1 = extractSamples(populationSize, sampleSize, [(0, populationSize-1)])
        CPU times: user 449 ms, sys: 8.92 ms, total: 458 ms
        Wall time: 442 ms
        

        请注意,我减少了populationSize 的值,因为它在使用random.sample 解决方案时会为更高的值产生内存错误(在之前的答案herehere 中也提到过)。对于上述值,我们还可以观察到 extractSamples 优于 random.sample 方法。

        附: :虽然核心方法与我的earlier answer 相似,但在实现和方法上都进行了实质性修改,并提高了清晰度。

        【讨论】:

          【解决方案13】:

          我发现了一种比使用range 函数(非常慢)和不使用python 中的random 函数更快的方法(我不喜欢random 内置库,因为当你播种它,它会重复随机数生成器的模式)

          import numpy as np
          
          nums = set(np.random.randint(low=0, high=100, size=150)) #generate some more for the duplicates
          nums = list(nums)[:100]
          

          这是相当快的。

          【讨论】:

            【解决方案14】:

            尝试使用...

            import random
            
            LENGTH = 100
            
            random_with_possible_duplicates = [random.randrange(-3, 3) for _ in range(LENGTH)]
            random_without_duplicates = list(set(random_with_possible_duplicates)) # This removes duplicates
            

            优点

            快速、高效且易读。

            可能的问题

            如果有重复,这个方法可以改变列表的长度。

            【讨论】:

            • 这是一种非常不稳定的方法,因为用户无法控制列表的最终长度。不确定我是否可以看到这个用例
            【解决方案15】:

            基于集合的方法(“如果返回值中有随机值,请重试”)的问题在于,它们的运行时间由于冲突(需要另一个“重试”迭代)而不确定,尤其是当大量随机从范围返回值。

            一种不易出现这种非确定性运行时的替代方法如下:

            import bisect
            import random
            
            def fast_sample(low, high, num):
                """ Samples :param num: integer numbers in range of
                    [:param low:, :param high:) without replacement
                    by maintaining a list of ranges of values that
                    are permitted.
            
                    This list of ranges is used to map a random number
                    of a contiguous a range (`r_n`) to a permissible
                    number `r` (from `ranges`).
                """
                ranges = [high]
                high_ = high - 1
                while len(ranges) - 1 < num:
                    # generate a random number from an ever decreasing
                    # contiguous range (which we'll map to the true
                    # random number).
                    # consider an example with low=0, high=10,
                    # part way through this loop with:
                    #
                    # ranges = [0, 2, 3, 7, 9, 10]
                    #
                    # r_n :-> r
                    #   0 :-> 1
                    #   1 :-> 4
                    #   2 :-> 5
                    #   3 :-> 6
                    #   4 :-> 8
                    r_n = random.randint(low, high_)
                    range_index = bisect.bisect_left(ranges, r_n)
                    r = r_n + range_index
                    for i in xrange(range_index, len(ranges)):
                        if ranges[i] <= r:
                            # as many "gaps" we iterate over, as much
                            # is the true random value (`r`) shifted.
                            r = r_n + i + 1
                        elif ranges[i] > r_n:
                            break
                    # mark `r` as another "gap" of the original
                    # [low, high) range.
                    ranges.insert(i, r)
                    # Fewer values possible.
                    high_ -= 1
                # `ranges` happens to contain the result.
                return ranges[:-1]
            

            【讨论】:

              【解决方案16】:

              如果您希望确保添加的数字是唯一的,您可以使用Set object

              如果使用 2.7 或更高版本,否则导入 sets 模块。

              正如其他人所提到的,这意味着这些数字并不是真正随机的。

              【讨论】:

                【解决方案17】:

                minvalmaxval 之间对整数进行采样而不替换:

                import numpy as np
                
                minval, maxval, n_samples = -50, 50, 10
                generator = np.random.default_rng(seed=0)
                samples = generator.permutation(np.arange(minval, maxval))[:n_samples]
                
                # or, if minval is 0,
                samples = generator.permutation(maxval)[:n_samples]
                

                使用 jax:

                import jax
                
                minval, maxval, n_samples = -50, 50, 10
                key = jax.random.PRNGKey(seed=0)
                samples = jax.random.shuffle(key, jax.numpy.arange(minval, maxval))[:n_samples]
                

                【讨论】:

                • 为什么要生成可能大量元素的排列,然后只选择其中的第一个n_samples?您采用这种方法的原因是什么?与大量现有答案(大部分来自 8 年前)相比,您能否解释一下您的方法有哪些优势?
                • 实际上我的答案与其他投票最多的答案具有相似的复杂性,并且因为它使用 numpy.其他投票最多的方法使用 random.shuffle,它使用 Mersenne Twister,qhich 比 numpy(可能还有 jax)提供的算法慢得多。 numpy 和 jax 允许其他随机数生成算法。 jax 还允许 jit 编译和微分,这对于随机微分很有用。此外,关于“可能很大”的数组,一些投票最多的答案与random.shuffle 做完全相同的事情,我认为这在相对甚至绝对意义上都不是有罪的
                • 不确定您所说的“random.shuffle 使用 Mersenne Twister”是什么意思——正如几个答案中提到的,它是 Fisher-Yates 洗牌。它具有线性时间复杂度,因此它不可能比任何其他库(numpy 或其他库)提供的算法渐进地慢。如果 numpy 更快,那只是因为它是在 C 中实现的,但这并不保证生成巨大的排列(甚至可能不适合内存的排列),只能从中选择一些元素。除了你的答案之外,没有一个 single 答案可以做到这一点。
                • 抱歉,我读到 python random 使用 Mersenne Twister,因为它是 prng。您是否有消息来源,以便我了解有关 Fisher Yates 和 random.shuffle 中的角色的更多信息?
                • 这里已经有两个单独的链接指向维基百科,这里有两个单独的答案。如果 Wikipedia 对您来说不够好,文章末尾有 14 个参考资料。然后是谷歌。这有帮助吗?哦,random 模块是用 Python 编写的,因此您可以轻松查看其源代码(试试random.__file__)。
                【解决方案18】:
                import random
                
                sourcelist=[]
                resultlist=[]
                
                for x in range(100):
                    sourcelist.append(x)
                
                for y in sourcelist:
                    resultlist.insert(random.randint(0,len(resultlist)),y)
                
                print (resultlist)
                

                【讨论】:

                • 欢迎来到 Stackoverflow。请解释您的答案为什么以及如何解决问题,以便其他人可以轻松理解您的答案。
                • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案以添加解释并说明适用的限制和假设。 From Review
                【解决方案19】:

                如果你想要的数字数量是随机的,你可以这样做。在这种情况下,长度是您要选择的最大数字。

                如果它注意到已经选择了新的随机数,它会从 count 中减去 1(因为在它知道是否重复之前添加了一个 count)。如果它不在列表中,那么对它做你想做的事情并将它添加到列表中,这样它就不会被再次选中。

                import random
                def randomizer(): 
                            chosen_number=[]
                            count=0
                            user_input = int(input("Enter number for how many rows to randomly select: "))
                            numlist=[]
                            #length = whatever the highest number you want to choose from
                            while 1<=user_input<=length:
                                count=count+1
                                if count>user_input:
                                    break
                                else:
                                    chosen_number = random.randint(0, length)
                                    if line_number in numlist:
                                        count=count-1
                                        continue
                                    if chosen_number not in numlist:
                                        numlist.append(chosen_number)
                                        #do what you want here
                

                【讨论】:

                  【解决方案20】:

                  来自 win xp 中的 CLI:

                  python -c "import random; print(sorted(set([random.randint(6,49) for i in range(7)]))[:6])"
                  

                  在加拿大,我们有 6/49 Lotto。我只是将上面的代码包装在 lotto.bat 中并运行 C:\home\lotto.bat 或只是 C:\home\lotto

                  因为random.randint经常重复一个数字,所以我用setrange(7),然后把它缩短到6的长度。

                  有时,如果一个数字重复超过 2 次,则结果列表长度将小于 6。

                  编辑:但是,random.sample(range(6,49),6) 是正确的方法。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-05-09
                    • 2010-10-16
                    • 2019-02-21
                    • 2013-10-28
                    • 2012-03-14
                    相关资源
                    最近更新 更多