Python Random没有重复

时间:2014-11-25 20:24:06

标签: python list random

这是我的代码,我试图用0到6之间的7个数字填充列表,没有重复,每次都是随机顺序。这是我的代码,但我一直收到错误"列表分配索引超出范围",我不知道我的错误在哪里。这是我的代码:

    import random
def generate():
    listA = []
    for x in range(0,6):
        listA[x] = random.sample(range(6), 1)
generate()
print(listA)

3 个答案:

答案 0 :(得分:5)

仅仅shuffle range的结果会更有效。

>>> from random import shuffle
>>>
>>> r = range(7)
>>> shuffle(r)
>>> r
[5, 3, 6, 4, 1, 0, 2]

请注意,在Python 3中,您必须将r显式转换为列表:

>>> r = list(range(7))

答案 1 :(得分:1)

您可以使用random.shuffle

list_ = list(range(7)) #a list from 0 to 6. list() not needed in Python 2
shuffle(list_)
print(list_)

但是,如果您的洗牌清单很大,您应该考虑:

  

注意,即使相当小的len(x),x的排列总数也大于大多数随机数生成器的周期;这意味着永远不会产生长序列的大多数排列。

所以你应该手动实现它:

yourlist = range(1000) #or a bigger number, or an arbitrary list
yournewlist = []
for i in range(len(yourlist)):
    yournewlist.append(yourlist.pop(random.randint(0, len(yourlist)-1)))

注意我计算len(yourlist) N + 1次。该值永远不应存储在变量中。第一个计算定义了迭代(在Python 2中,您可以使用xrange而不是range进行计数迭代)。以下迭代将具有不同的len(yourlist)值(从N到1)。请记住,randint(lowerBound, uppweBound)将包含upperBound,因此您应始终使用0和长度-1来获取有效的列表索引。这会影响许多其他语言,如Pascal,它们不包括整数随机函数的预期结果中的upperBound值。

记住:我描述的算法和使用os shuffle都会改变原始列表。我的阿尔格。将结果放在一个不同的列表中。

答案 2 :(得分:0)

要在列表末尾指定元素,请使用listA.append(…)

您要做的是替换不存在的广告位的值,这就是您获得IndexError的原因。

另外,我很确定你只是想要listA = random.sample(range(6), 6)。您所写的内容只是进行了6次单独的1元素采样,每次采样都没有重复

(或者,你可以写listA = range(6)然后random.shuffle(listA)。)