本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
pick N items at random
我需要生成1到49之间的6个随机数,但是它们不能相同。 我知道如何使它们随机化,但我不确定如何确保它们不同。
该工作表建议显示每个数字并将其设置为零,但我看不出有什么帮助。
任何意见是极大的赞赏。
您应该发布您尝试过的内容。
您当然会意识到,如果它们不能相同,那么按照定义,它们不再是真正随机的。
是的,它们仍然是随机的,只是它们是从稍微小的列表中拉出来的。
@keirbtre:通过对随机数施加任何约束,可以使这些数字的随机性降低。
我知道它们的随机性较小,但是它们仍然是随机的。 您不知道会选择什么号码。
@finnw这确实不是重复的。 由于长度未知,"从未知长度的序列中随机抽取N个项目"是完全不同的问题。 对于已知长度的情况,存在一些可用的快捷方式,这些快捷方式在序列长度未知的情况下不可用。 所选数字的分布也将不同。 请删除具有误导性的重复标记。
您可以使用random.sample:
>>> 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."
假设这是一项任务,并且您需要自己实施采样,则可以看看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
如果您想尝试不同的方法,可以考虑多种其他方法,例如将列表随机化,然后截断,或某种形式的储层采样。
祝您工作顺利。
如果使用Python 3,请将xrange更改为range。
非常感谢! 这确实是任务的一部分。 您非常有帮助:)
别客气。
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
对于关心效率的人们来说,这里是我的解决方案和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
决心要同时!