如何生成带权重且有连续值出现限制的随机数列表
实现思路
- 逐位生成而非批量生成:因为需要依赖前序生成结果判断当前可选值,所以放弃一次性调用
random.choices生成全部序列的方案,改为循环逐个生成每个位置的数值 - 维护连续计数状态:每次生成前记录两个状态:当前末尾连续出现0的次数、连续出现2的次数,用来快速过滤不符合规则的候选值
- 动态调整候选池和权重:每次根据状态过滤掉不允许选择的数值后,保留剩余合法数值对应的原始权重,直接传入
random.choices做单次加权随机,保证整体数值分布尽可能贴近原始权重设定
代码实现
import random def generate_weighted_list(target_len=100): # 原始加权配置 population = [0, 1, 2] original_weights = [0.4, 0.3, 0.3] res = [] # 连续计数状态变量 consec_0 = 0 consec_2 = 0 for _ in range(target_len): # 筛选当前合法候选及对应权重 allowed_vals = [] allowed_weights = [] for val, w in zip(population, original_weights): # 禁止连续0:已经有1个0的情况不能再选0 if val == 0 and consec_0 >= 1: continue # 禁止连续2超过2次:已经有2个连续2的情况不能再选2 if val == 2 and consec_2 >= 2: continue allowed_vals.append(val) allowed_weights.append(w) # 生成当前位的随机数 current = random.choices(allowed_vals, weights=allowed_weights, k=1)[0] res.append(current) # 更新连续计数状态 if current == 0: consec_0 += 1 consec_2 = 0 elif current == 2: consec_2 += 1 consec_0 = 0 else: # 选1的话两类连续计数都清零 consec_0 = 0 consec_2 = 0 return res # 调用示例 result = generate_weighted_list(100) print(result)
规则校验
你可以通过以下代码验证生成结果是否符合要求:
# 校验是否存在连续0 has_consecutive_0 = any(result[i] == 0 and result[i-1] == 0 for i in range(1, len(result))) # 校验是否存在连续超过2次的2 has_consecutive_2 = any(result[i] == 2 and result[i-1] == 2 and result[i-2] == 2 for i in range(2, len(result))) # 统计数值分布,可观察是否接近0.4:0.3:0.3的比例 from collections import Counter print("数值分布:", Counter(result)) print("是否存在连续0:", has_consecutive_0) print("是否存在连续3个及以上2:", has_consecutive_2)
内容的提问来源于stack exchange,提问作者Difio
相关产品推荐
相关产品推荐

