【问题标题】:Repeated Random Numbers重复的随机数
【发布时间】:2014-03-22 23:09:06
【问题描述】:

我创建了一个宾果游戏,其中生成随机数并调用列表。

bingo_num = random.randint(1,100)

如何阻止多次生成随机数

【问题讨论】:

  • 你需要多少个随机数?

标签: python random integer


【解决方案1】:

我建议random.shuffle

from random import shuffle
my_list = range(100)
shuffle(my_list)
print my_list

但如果你只需要特定数量的唯一数字,你可以使用random.sample,像这样

from random import sample
my_list = range(100)
print sample(my_list, 10)

【讨论】:

    【解决方案2】:

    您可以从随机库中获取一个范围的sample

    >>> import random
    >>> nums = random.sample(range(0,200),100)
    >>> nums
    [143, 149, 52, 183, 161, 179, 180, 155, 163, 157, 139, 15, 154, 181, 56, 29, 31,
     14, 77, 82, 165, 32, 35, 92, 109, 172, 69, 99, 54, 3, 88, 76, 11, 126, 78, 162,
     198, 145, 124, 75, 114, 174, 136, 100, 190, 193, 148, 153, 167, 113, 38, 17, 16
    8, 0, 196, 73, 47, 164, 184, 6, 140, 30, 58, 74, 4, 79, 147, 178, 191, 21, 112,
    13, 27, 57, 199, 116, 28, 104, 111, 71, 23, 85, 170, 25, 141, 156, 91, 7, 182, 1
    34, 94, 169, 175, 166, 137, 160, 129, 36, 67, 135]
    

    【讨论】:

      【解决方案3】:

      只需像在真实宾果游戏中那样做。他们不掷骰子,而是把所有的数字都放在一个大袋子里,摇一摇,然后一个一个地抽出来,直到用完所有的数字。

      numbers = list(range(1, 101)) # all the numbers in the bag, from 1 to 100
      random.shuffle(numbers)       # shake the bag
      bingo_num = numbers.pop()     # pull out next number (inside your loop)
      

      【讨论】:

        【解决方案4】:

        您可以先创建一个包含所有可能数字的列表。然后从该列表中选择一个随机数,将其添加到结果列表中,最后将其从可能的数字列表中删除。

        例如,如果您想要来自0-9 的 5 个不同的数字:

        possible_numbers = range(10)
        numbers = []
        
        for i in range(5):
            index = random.randint(0, len(possible_numbers) - 1)
            numbers.append(possible_numbers[index])
            del possible_numbers[index]
        

        【讨论】:

        • 我认为 random.shuffle 做得更好。
        • @RemcoGerlich:你是对的。在阅读其他答案之前,我想到了这个解决方案,并认为我会保留它。如果您不了解shufflesample,对我来说这是最直接的方法。虽然这不是最优雅的方法,但知道如何自己做当然也不错。 ;-)
        【解决方案5】:

        这样的事情应该可以工作:

        numbers = []
        while len(numbers) < 100:
            bingo_num = random.randint(1,100)
        
            if not bingo_num in numbers:
                numbers.append(bing_num)
        

        【讨论】:

        • 即使random.randint 从未两次生成任何数字,这也需要二次时间,如果生成的话,时间会更长。
        • @delnan 确实如此,但效率不高。鉴于应用程序(宾果游戏),它可能是可以接受的。
        【解决方案6】:

        如果已经在使用,您可以创建一个新号码

        优点:代码简单

        缺点:如果几乎所有数字都被使用,会运行很长时间(有更好的解决方案)

        示例代码:

        bingo_num_list = []
        
        # init num
        bingo_num = random.randint(1,100)
        
        # create new numbers till "find" a not used one
        while bingo_num in bingo_num_list:
            bingo_num = random.randint(1,100)
        
        bingo_num_list.append(bingo_num)
        

        【讨论】:

          【解决方案7】:

          构建所有数字的列表,然后随机选择一个 1,将其从列表中删除,然后选择下一个:

          #!/usr/bin/python
          import random
          
          myNumz=[]
          xIdx=1
          while xIdx<101:
          myNumz.insert(xIdx,xIdx)
              xIdx+=1
          
          xIdx=100
          while xIdx>0:
              xIdx-=1
              baseNum=random.randint(0,xIdx)
              print myNumz[baseNum]
              myNumz.remove(myNumz[baseNum])
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-19
            • 1970-01-01
            • 1970-01-01
            • 2013-07-05
            • 2013-01-10
            • 1970-01-01
            相关资源
            最近更新 更多