15

可能重复:
随机选择 N 个项目

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

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

任何意见是极大的赞赏。

4

3 回答 3

42

您可以使用random.sample

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

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

假设这是一项任务,并且您需要自己实现采样,您可以看看是如何random.sample实现的。它确实提供了丰富的信息,但对于您的需求可能过于复杂,因为代码还确保所有子切片也是有效的随机样本。为了提高效率,它还根据人口规模使用不同的方法。

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

population = range(1, 50) # 从 1 到 49 的数字列表
样品 = []
直到我们得到 6 个样本:
  index = 0 到 48 之间的随机数 # 查找 random.randint()
  if population[index] is not 0: # 如果我们找到一个未标记的值
    将人口[索引]附加到样本
    set population[index] = 0 # 标记选中

如果您想尝试不同的方法,还有许多其他方法可以考虑,例如随机化列表然后截断,或某种形式的水库采样

祝你的任务好运。

于 2012-11-29T15:12:40.090 回答
13

Aset不会保留任何重复项:

s = set()
while len(s) < 6:
    s.add(get_my_new_random_number())
于 2012-11-29T15:12:07.760 回答
2

这是一个非常常见和愚蠢的面试问题,这是它的解决方案/算法:

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

决心要同时!

于 2012-11-29T15:27:26.963 回答