可能重复:
挑随机N项
我需要生成1到49之间的6张随机数,但它们不能是相同的。 我知道该怎么做让他们随机的,我只是不知道如何确保它们是不同的。
该表显示建议每个号码并将其设为零,但我看不出这将有助于。
任何意见是极大的赞赏。
可能重复:
挑随机N项
我需要生成1到49之间的6张随机数,但它们不能是相同的。 我知道该怎么做让他们随机的,我只是不知道如何确保它们是不同的。
该表显示建议每个号码并将其设为零,但我看不出这将有助于。
任何意见是极大的赞赏。
您可以使用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
如果你想尝试不同的东西,还有很多其他的方法来考虑如随机化列表,然后截断,或某种形式的水库取样 。
祝你的任务。
一set
将不保留任何副本:
s = set()
while len(s) < 6:
s.add(get_my_new_random_number())
这是一个非常常见的和愚蠢的面试问题,这里是它的解决方案/算法:
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
决心是同一时间!