python - 随机数列表生成器未按预期工作(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)
解决方案
您非常明确地不要从剩余列表中随机抽取数字:
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
.
推荐阅读
- javascript - 我可以使用 Cypress 从包含在 Vue 组件中的元素触发文件上传吗?
- javascript - 如何在控制台的一行中将两个多行字符串并排放置?
- scala - 在 spark scala 作业期间内存不足异常或工作节点丢失
- batch-file - 在运行命令之前预览命令输出到文本文件(批处理)
- php - 如何从 laravel 中的中间表(多对多关系)中获取数据
- vue.js - 大型应用程序:多个 Vue 应用程序或一个具有多个组件的 Vue 应用程序?
- tfs - TFS 构建将消息写入摘要
- javascript - Typescript 类实现模式
- c# - C# 将泛型类更改为子类
- angular - 在 Kendo for Angular 中禁用打开上下文菜单