【问题标题】:How do i make a list of random unique numbers that avoid using numbers from an already existing list of random unique numbers?如何制作一个随机唯一数字列表,以避免使用现有随机唯一数字列表中的数字?
【发布时间】:2018-04-12 04:10:54
【问题描述】:

我正在尝试制作一台彩票机,它可以生成 1-34 的 7 个中奖号码和 3 个奖金号码的列表。我希望奖金号码永远不会选择与中奖号码相同的号码。

winning_numbers = random.sample(range(1, 34), 7)
bonus_numbers = random.sample(range(1, 34), 3)

是否有任何命令/代码可以排除上一个列表中已经选择的数字?

【问题讨论】:

标签: python


【解决方案1】:

random解决方案

如果你只想使用random模块,你可以使用:

import random

nums = random.sample(range(1,35), 10)

winning_numbers = nums[:7]
bonus_numbers = nums[7:]

>>> winning_numbers
[2, 23, 29, 34, 26, 16, 13]

>>> bonus_numbers
[8, 4, 19]

因为random.sample 是“用于无替换的随机抽样”。 (引自docs

numpy解决方案

您也可以使用numpy,因为numpy.random.choice 有一个replace 参数,您可以将其设置为false。 (我个人是一个粉丝,或者将numpy 用于随机数,因为它在更复杂的任务中提供了比random 更大的灵活性)

import numpy as np

nums = np.random.choice(range(1,35), 10, replace=False)

winning_numbers = nums[:7]
bonus_numbers = nums[7:]


>>> winning_numbers
array([27,  4, 17, 30, 32, 21, 23])

>>> bonus_numbers
array([15, 13, 18])

【讨论】:

    【解决方案2】:

    开头的一个小但并非不重要的评论:

    无论是先抽7个号码再抽剩下的3个号码,还是直接抽10个号码,分成7个中奖号码和3个中奖号码,在概率上是绝对等价的

    在第一种情况下,任何数字成为奖金数字的概率是:

    第二个:

    请注意,任何号码成为中奖号码的概率的推理都是一样的。

    实现第一种情况实际上稍微长一些,但在使用setset operations 时仍然相当简单。 这是它的外观:

    import random
    
    # set of all potential numbers to draw from
    all_numbers = set(range(1,35))  
    # draw the winners
    winning_numbers = set(random.sample(all_numbers, 7)  
    # subtract the winners
    remaining_numbers = all_numbers-winning_numbers  
    # draw the bonus from the remaining numbers:
    bonus_numbers = set(random.sample(remaining_numbers, 3)) 
    

    第二种情况的实现是最小的,可能如下所示:

    import random
    
    drawn_numbers = random.sample(range(1,35), 10)
    winning_numbers, bonus_numbers = drawn_numbers[:7], drawn_numbers[7:]
    

    希望对您有所帮助并祝您编码愉快!

    【讨论】:

      【解决方案3】:

      这样的?

      import random
      winning_numbers = random.sample(range(1, 34), 7)
      bonus_numbers = []
      while 1==1:
        num = random.randint(1,34)
        if len(bonus_numbers) == 3:
          break
        if num not in winning_numbers and num not in bonus_numbers:
          bonus_numbers.append(num)
      

      【讨论】:

        猜你喜欢
        • 2013-04-22
        • 2015-06-27
        • 1970-01-01
        • 1970-01-01
        • 2018-02-16
        • 2014-05-29
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多