You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成带权重且有连续值出现限制的随机数列表

实现思路
  • 逐位生成而非批量生成:因为需要依赖前序生成结果判断当前可选值,所以放弃一次性调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:39:02