如何生成不同的随机数?

2024-04-29 18:40:17 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
pick N items at random

我需要生成6个介于1和49之间的随机数,但它们不能相同。我知道如何使他们随机,我只是不确定如何确保他们是不同的。

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

任何建议都非常感谢。


Tags: items数字random建议atpickduplicatepossible
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's的测试台:

>>> 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

决心在同一时间!

set不会保留任何重复项:

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

您可以使用^{}

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

"The worksheet recommends displaying each number and setting it to zero, but I don't see how that would help."

假设这是一个赋值,并且您需要自己实现采样,那么您可以take a look at how ^{} 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

祝你的作业顺利。

相关问题 更多 >