如何生成不同的随机数? [重复](How to generate random numbers

2019-06-21 08:33发布

可能重复:
挑随机N项

我需要生成1到49之间的6张随机数,但它们不能是相同的。 我知道该怎么做让他们随机的,我只是不知道如何确保它们是不同的。

该表显示建议每个号码并将其设为零,但我看不出这将有助于。

任何意见是极大的赞赏。

Answer 1:

您可以使用random.sample

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

“工作表显示建议每个号码并将其设为零,但我看不出这会有所帮助。”

假设这是一个任务,你需要实现自己取样,你可以看看如何random.sample实现 。 这真的很翔实,但可能对您的需求太复杂,因为代码也保证了所有的子片段也将是有效随机样本。 为了提高效率,它也使用取决于人口规模不同的方法。

至于工作,我相信它假设你开始了与从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

如果你想尝试不同的东西,还有很多其他的方法来考虑如随机化列表,然后截断,或某种形式的水库取样 。

祝你的任务。



Answer 2:

set将不保留任何副本:

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


Answer 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

对于人们关心的效率这里是我的解决方案和齐秦的的测试平台:

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

决心是同一时间!



文章来源: How to generate random numbers that are different? [duplicate]