【问题标题】:Python Random's with no repeatsPython Random 没有重复
【发布时间】:2015-01-24 00:07:18
【问题描述】:

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

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

【问题讨论】:

  • 提示:当你有一个长度为 0 的列表时,执行 my_list[whatever] = something 总是会失败。该列表不会自行调整大小以适应新元素。

标签: python list random


【解决方案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) 将包括上界,因此您应该始终使用 0 和长度 - 1 来获得有效的列表索引。这与许多其他语言(如 Pascal)形成鲜明对比,后者在整数随机函数的预期结果中不包括上界值。

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

【讨论】:

    【解决方案2】:

    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))
    

    【讨论】:

      【解决方案3】:

      要分配列表末尾之后的元素,请使用listA.append(…)

      您要做的是替换不存在的插槽的值,这就是您得到IndexError 的原因。

      另外,我很确定你只是想要listA = random.sample(range(6), 6)。你所写的只是做了 6 个单独的 1 元素采样,在每个采样中没有重复

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-25
        • 2019-10-18
        • 2013-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多