【问题标题】:How to generate random numbers that are different? [duplicate]如何生成不同的随机数? [复制]
【发布时间】:2012-11-29 15:09:17
【问题描述】:

可能重复:
pick N items at random

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

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

非常感谢任何建议。

【问题讨论】:

  • 您应该发布您尝试过的内容。
  • 您当然会意识到,如果它们不能相同,那么根据定义,它们就不再是真正随机的了。
  • 是的,它们仍然是随机的,只是它们是从一个稍小的列表中拉出来的。
  • @keirbtre:通过对随机数实施任何限制,您可以减少这些数字的随机性。
  • 我知道它们不那么随机,但它们仍然是随机的。你不知道会选择什么号码。

标签: python random numbers


【解决方案1】:

你可以使用random.sample:

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

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

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

至于工作表,我相信它假设您从 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 # 标记选中

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

祝你任务顺利。

【讨论】:

  • 如果使用 Python 3,请将 xrange 更改为 range
  • 非常感谢!这确实是任务的一部分。你很有帮助:)
【解决方案2】:

set 不会保留任何重复项:

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

【讨论】:

    【解决方案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的测试台:

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

    决心是同一时间!

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      相关资源
      最近更新 更多