保序前提下合并列表重复和值对应概率的实现方法(非公平骰子场景)
实现方案
核心逻辑
通过同时遍历和值、概率对,用字典记录已出现和值的累计概率+列表保存首次出现顺序的方式实现需求,时间复杂度为O(n),完全适配数百次投掷、数百个面的计算量级,无额外内存压力。
代码实现(Python)
# 输入为你每次投掷生成的和值列表、对应概率列表 Sums = [6,4,2,5,4,3] Probs = [11/36, 9/36, 7/36, 5/36, 3/36, 1/36] sum_prob_map = {} condensed_sums = [] condensed_prob = [] for s, p in zip(Sums, Probs): if s not in sum_prob_map: # 首次出现的和值,同时写入顺序列表和映射字典 sum_prob_map[s] = p condensed_sums.append(s) else: # 重复出现的和值,仅累加对应概率 sum_prob_map[s] += p # 按保留的和值顺序提取累计后的概率 condensed_prob = [sum_prob_map[s] for s in condensed_sums]
输出验证
运行后结果完全匹配预期:
condensed_sums = [6, 4, 2, 5, 3]- 转换为分数后
condensed_prob = [11/36, 12/36, 7/36, 5/36, 1/36]
现有逻辑适配说明
该方案完全保留你原有和值的生成顺序,不会破坏前置逻辑中「前len(faces)个数值概率系数为1、剩余为2」的计算约定,仅需要在每次生成和值列表、对应概率列表后,替换原有去重逻辑为上述代码即可。
内容的提问来源于stack exchange,提问作者ShayStiers
相关产品推荐
相关产品推荐

