如何生成不同的随机数?

时间:2012-11-29 15:09:17

标签: python random numbers

  

可能重复:
  pick N items at random

我需要在1到49之间生成6个随机数,但它们不能相同。我知道如何让它们随机,我只是不确定如何确保它们不同。

工作表建议显示每个数字并将其设置为零,但我不知道这会有什么帮助。

非常感谢任何建议。

3 个答案:

答案 0 :(得分:40)

您可以使用random.sample

>>> random.sample(xrange(1,50), 6)
[26, 39, 36, 46, 37, 1]

  

“工作表建议显示每个数字并将其设置为零,但我不知道这会有什么帮助。”

假设这是一项任务,您需要自己实施抽样,您可以take a look at how random.sample is implemented。它确实提供了丰富的信息,但可能因您的需求而过于复杂,因为代码还可确保所有子切片也是有效的随机样本。为了提高效率,它还根据人口规模使用不同的方法。

至于工作表,我认为它假设您从1到49的数字列表开始,并建议您用0替换您选择的数字,以便重新选择时可以跳过。这里有一些伪代码可以帮助您入门:

population = range(1, 50)  # list of numbers from 1 to 49
sample = []
until we get 6 samples:
  index = a random number from 0 to 48  # look up random.randint()
  if population[index] is not 0:  # if we found an unmarked value
    append population[index] to sample
    set population[index] = 0  # mark selected

如果您希望尝试不同的方法,还有许多其他方法需要考虑,例如:随机化列表然后截断,或某种形式的reservoir sampling

祝你好运。

答案 1 :(得分:13)

set不会保留任何重复:

s = set()
while len(s) < 6:
    s.add(get_my_new_random_number())

答案 2 :(得分:3)

这是一个非常常见和愚蠢的访谈问题,这是其解决方案/算法:

import random
a = range(1,50)
for i in xrange(6):
    b = a[random.randint(0,len(a)-i)]
    a.remove(b)
    print b

对于关心效率的人来说,这是我的解决方案和Chin的试验台:

>>> random.sample(xrange(1,50), 6)
[26, 39, 36, 46, 37, 1]

结果:

>python -mtimeit -s'import try2'
[38, 7, 31, 24, 30, 32]
100000000 loops, best of 3: 0.0144 usec per loop
>python -mtimeit -s'import try1'
36
26
41
31
37
14
100000000 loops, best of 3: 0.0144 usec per loop

决定是同一时间!