如何用Python生成每个子数组内首元素不重复的随机3D数组
Python 生成符合规则的随机3D作业数组实现方案
原代码问题梳理
- 重复检查逻辑反向:你写的
while random_value not in jobs[x]是当值不存在时一直循环,反而会强制生成已存在的值,和需求完全相反 - 重复检查对象错误:
jobs[x]中存储的是二维元素,直接判断单个数字是否在jobs[x]里永远为False,根本起不到去重作用 - 语法缩进错误:
for z in range(2)这行的缩进超出了上一层循环的范围,运行会直接报错
正确实现代码
import random job_count = 5 jobs = [] # 元组第一个元素的可选范围,可按需调整 first_val_range = range(1, 11) # 元组第二个元素的可选范围,可按需调整 second_val_range = range(1, 51) # 每个job的长度范围 job_len_range = range(2, 6) for _ in range(job_count): current_job = [] used_first = set() # 随机生成本次job的长度 job_len = random.choice(job_len_range) for _ in range(job_len): # 生成不重复的第一个元素 first = random.choice(first_val_range) while first in used_first: first = random.choice(first_val_range) used_first.add(first) # 生成随机第二个元素 second = random.choice(second_val_range) current_job.append((first, second)) jobs.append(current_job)
实现说明
- 为每个job单独维护一个
used_first集合,记录当前job已经用过的元组第一个元素,检查重复的时间复杂度为O(1)- 每次生成第一个元素时判断是否已存在于集合中,存在就重新生成,保证唯一
- 元组第二个元素直接随机生成即可,无重复限制
- 所有范围参数都单独提取出来,方便后续按需调整
运行示例(随机生成,每次结果不同)
[ [(2, 17), (7, 3), (9, 42), (5, 19)], [(3, 31), (10, 22), (6, 7)], [(1, 45), (7, 13), (9, 28), (4, 11), (3, 39)], [(8, 9), (2, 33), (5, 17)], [(10, 48), (4, 21), (6, 37), (1, 9)] ]
内容的提问来源于stack exchange,提问作者Jume
相关产品推荐
相关产品推荐

