Python:基于指定规律数据集生成非规律随机唯一数列表
需求与现有问题
- 现有
sample-list-1.csv存储了24个数据集列表,每个列表包含5个1-36范围内的不重复整数 - 这些列表存在两种序列规律:相邻数递增1(如list1)或递增6(如list16)
- 目标:生成1-36范围内的5个不重复随机数列表,需避免完全符合上述任一规律,最多仅允许2个元素匹配原列表的规律特征
- 当前代码仅能单次遍历单个列表,效率低下,需要优化为一次性遍历所有数据集列表来生成符合要求的随机列表
优化方案思路
- 批量读取所有数据集:一次性读取CSV中所有24个列表,转换为整数列表集合,为后续快速比对做准备
- 构建规律校验函数:分别实现两种序列规律的校验逻辑,直接判断生成的随机列表是否违反禁止规则
- 高效比对逻辑:利用集合交集操作快速计算新列表与已有列表的元素匹配数量,替代嵌套循环的低效遍历
- 循环生成合规列表:生成随机列表后,先校验自身是否符合禁止规律,再比对所有已有列表,直到生成完全符合要求的结果
完整实现代码
import random import csv def check_increment_1(num_list): """校验列表是否符合相邻数递增1的规律""" sorted_nums = sorted(num_list) for i in range(1, len(sorted_nums)): if sorted_nums[i] - sorted_nums[i-1] != 1: return False return True def check_increment_6(num_list): """校验列表是否符合相邻数递增6的规律""" sorted_nums = sorted(num_list) for i in range(1, len(sorted_nums)): if sorted_nums[i] - sorted_nums[i-1] != 6: return False return True def is_valid(new_list, existing_lists): """判断新列表是否合规:不违反禁止规律,且与任一已有列表的匹配元素≤2""" # 先检查自身是否符合禁止的序列规律 if check_increment_1(new_list) or check_increment_6(new_list): return False # 遍历所有已有列表,检查元素匹配数量 new_set = set(new_list) for lst in existing_lists: common_count = len(new_set & set(lst)) if common_count > 2: return False return True # 批量读取所有数据集列表 existing_lists = [] with open('sample-list-1.csv', newline='') as f: reader = csv.reader(f) for row in reader: if row: # 跳过空行(若存在) existing_lists.append([int(x) for x in row]) # 生成符合要求的随机列表 while True: new_pick = random.sample(range(1, 37), 5) if is_valid(new_pick, existing_lists): print("合规随机列表:", new_pick) break
代码说明
- 规律校验:通过排序后检查相邻元素差值,精准判断是否符合目标禁止规律
- 批量读取:一次性加载所有数据集,避免逐行单次处理的重复IO操作
- 高效比对:集合交集操作的时间复杂度远低于嵌套循环,大幅提升比对效率
- 循环生成:持续生成随机列表直到找到合规结果,确保最终输出完全满足要求
内容的提问来源于stack exchange,提问作者user136819
相关产品推荐
相关产品推荐

