【问题标题】:Is there a built-in function for creating a list of random numbers of size 'n'?是否有用于创建大小为“n”的随机数列表的内置函数?
【发布时间】:2015-03-10 19:36:14
【问题描述】:

创建随机数列表的标准方法是:

def generateList(n):
    randlist = []
    for i in range(n):
        randlist.append(random.randint(1,9))
    return randlist

不过,我最近偶然发现了random.sample,它更紧凑:

def generateList(n):
    return random.sample(range(1, 10), n)

但是如果n 大于 10,这会导致错误。所以,我的问题是,是否存在一个内置函数可以完全按照我的意图执行而不会出错?如果没有,是否至少有比第一个摘录更有效的替代方案(考虑到n 可能非常大)?

【问题讨论】:

  • 您误解了random.sample:请注意,随机列表中的任何数字都不会出现两次。 generateList 的较短版本是 lambda n: [randint(1,9) for _ in range(n)]

标签: python list random


【解决方案1】:

不,没有专门用于此任务的功能。但是如果你想压缩代码,你可以使用list comprehension

def generateList(n):
    return [randint(1, 9) for _ in range(n)]

【讨论】:

    【解决方案2】:

    我认为您只需要对其进行 n 次采样,每次的大小为 1。您遇到错误的原因是 sample 不想重复数字:当您从一个 10 元素的列表,它令人窒息。试试:

    def generateList(n, theList):
        return [random.sample(theList, 1) for _ in range(n)]
    

    【讨论】:

      【解决方案3】:

      抽样的活动是从大小为N的样本空间中选择最多N个元素。这就是您收到错误的原因。

      话虽如此,有很多有效的方法可以解决您的问题。

      1. 我们可以简单地将您的代码包装在列表理解中,就像这样

        def generateList(n):
            return [randint(1, 9) for i in range(n)]
        
      2. 使用randrange 而不是randint,像这样

        def generateList(n):
            return [randrange(1, 10) for i in range(n)]
        
      3. 如果可能的元素数量很少,你甚至可以像这样使用choice

        def generateList(n, sample_space = range(1, 10)):
            return [choice(sample_space) for i in range(n)]
        

      注意:由于n 会变大,如果您使用的是Python 2.7,请使用xrange 而不是range。您可以在this answer 中阅读更多关于差异的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        • 2018-07-15
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        相关资源
        最近更新 更多