是否有内置函数可用于创建大小随机数的列表&n;' n?

时间:2015-01-12 22:51:55

标签: python list random

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

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可能非常大)?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

抽样活动是从大小为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)]
    
  4. 注意:由于n会变大,如果您使用的是Python 2.7,请使用xrange代替range。您可以在this answer中了解有关差异的更多信息。

答案 2 :(得分:0)

我认为你只需要对它进行n次采样,每次都有1号尺寸。你遇到错误的原因是样本并不想重复数字:当你要求时来自10个元素列表的12个唯一数字,它会窒息。尝试:

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