【问题标题】:How do I generate multiple *different* random numbers? [duplicate]如何生成多个*不同的*随机数? [复制]
【发布时间】:2021-12-01 12:02:42
【问题描述】:

我正在尝试创建一个生成 5 个不同随机数列表的代码。这是我当前的代码:

import random

rN0 = random.randint(1, 50)
rN1 = random.randint(1, 50)
rN2 = random.randint(1, 50)
rN3 = random.randint(1, 50)
rN4 = random.randint(1, 50)

randomNumber = [rN0, rN1, rN2, rN3, rN4]

但是,有时它会在列表中产生两个或多个相同的数字。我希望列表中的每个数字每次都是唯一的。请帮忙?

【问题讨论】:

    标签: python list random


    【解决方案1】:

    您可以使用random.sample 从给定的range 中选择 n 个随机数:

    >>> random.sample(range(1, 50), 5)
    [4, 41, 16, 40, 25]
    

    【讨论】:

      【解决方案2】:

      这里有一个函数可以做到这一点:

      import random
      def difRandom(min,max,amount):
        li=[]
        if amount>max+1-min:
          raise Exception("Not enough random numbers to cover amount. \nPlease increase max or decrease min.")
        for x in range(0,amount):
          r=random.randint(min,max)
          while r in li:
            r=random.randint(min,max)
          li.append(r)
        return(li)
      

      所有数字都会不同。

      [编辑]

      更好的新功能:

      def difRandom(min,max,amount):
        li=[x for x in range(min,max+1)]
        final=[]
        if amount>max+1-min:
          raise Exception("Not enough random numbers to cover amount. \nPlease increase max or decrease min.")
        random.shuffle(li)
        for y in range(0,amount):
          final.append(li[y])
        return(final)
      

      上面这个函数快一点,不用等random.randint就可以搞定了。

      【讨论】:

      • 请注意,此类方法的时间复杂度无法计算。它有可能成为一个无限循环。
      • 不是这样,引发错误阻止了用户错误的发生。但是,我同意随机生成器永远不会生成一个数字来填充列表的可能性很小,无论多么小。不过,这是一个非常小的机会,我感觉随机生成器很快就会生成数字。
      • 没错,但我说的是random 函数的行为。 randint 可以在很长一段时间内返回“错误”号码。比较difRandom(1, 100000, 100000)random.sample 的性能。
      • 是的,没错。我可以做到的另一种方法是生成范围内所有数字的列表,然后从中取出一个随机数,每次都删除随机索引。它将创建一个永远不会返回某个值的不断缩短的列表,并且不会有相同的时间问题。
      • 这是一个研究得很好的课题。如果您有兴趣,请查找“Fisher-Yates shuffle”。
      【解决方案3】:

      您可以为此目的使用下面给出的代码:-

      import random
      
      #This code supposes that you need to generate 10 random integers.
      
      randomNumber = random.sample(range(1, 50), 10)
      
      #This function returns a list of random numbers within a given range 
      #The second parameter tells how many random numbers to generate for the list
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-14
        • 2014-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多