首页 > 解决方案 > 随机数列表生成器未按预期工作(Python)

问题描述

我制作了一个程序,旨在打印从数字数组中随机选择的数字列表,而不重复任何数字。

例如,我期望以下内容:

number_list(180, 222, 5)
219, 180, 185, 191, 197, 

但是我的程序给我的结果都是相似的,并且生成的数字总是接近数组的极值(180 和 222)。例如:

219, 180, 182, 181, 184, 
221, 181, 180, 183, 184,
219, 221, 222, 180, 181,
222, 219, 181, 180, 182, 

此时我认为我写的程序一定有问题,不是函数random.randomint()引起的问题。

我使用的代码如下:

from random import randint

def number_list(start, end, length):
    tot_list = []
    for i in range(start, end+1):
        tot_list.append(i)
    list_len = len(tot_list)
    while(length > 0):
        index = start - randint(start-1, start + length-1)
        length = length -1
        number = tot_list[index]
        tot_list.remove(number)
        print(str(number) + ", ")

number_list(180, 222, 5)

标签: pythonrandom

解决方案


您非常明确地不要剩余列表中随机抽取数字:

    index = start - randint(start-1, start + length-1)

您在这里和下面将值与索引混淆。在您给定的示例中,这将查找一个限制为 179 - 184 的随机数,然后从起始值中减去该随机数以获得列表中的索引。在此示例中,这将为您提供 -start+1 到 1 ... 或 -4 到 1 范围内的数字。这些在您的选择列表的末尾。

我很容易发现基本调试的问题:

    print("TRACE", start, length, index, number, tot_list)

请参阅这个可爱的调试博客寻求帮助。插入有用的输出语句来跟踪控制和数据流。删除不适用的代码;将工作代码简化为硬编码的结果。正如发布指南所说,“让其他人更容易帮助你。”


另外,请注意,random已经有一个功能可以做到这一点:sample.


推荐阅读