Python骰子统计模拟器递归代码输出值过高问题排查求助
Python骰子统计模拟器问题排查
问题根因
- 重复统计:
checking函数在递归的多个分支被重复调用,同一组骰子点数的和被多次计数,导致总统计值远高于理论值sides ** rolls - 递归边界错误:
recursiveloop中所有循环的边界都设置为rolls,和骰子面数sides不匹配,生成了大量无效重复的骰子组合 - 可变对象传递问题:Python中列表为可变对象,递归过程中传递的是列表引用,对列表的修改会同步影响所有上层调用的列表值,导致组合生成逻辑完全混乱
- 冗余打印干扰:代码中大量无关打印语句也会增加排查难度,调试阶段建议仅保留必要的输出
通用实现方案
你可以改用深度优先遍历直接生成所有合法骰子组合后统计,逻辑清晰且天然支持任意骰子面数、投掷次数的组合:
def count_dice_sum(sides: int, roll_times: int) -> dict: result = {} # 递归生成所有组合 def generate(remaining_rolls: int, current_total: int): if remaining_rolls == 0: result[current_total] = result.get(current_total, 0) + 1 return for point in range(1, sides + 1): generate(remaining_rolls - 1, current_total + point) generate(roll_times, 0) return result # 测试4d4场景 if __name__ == "__main__": sides = 4 rolls = 4 stat_res = count_dice_sum(sides, rolls) print("各和值出现次数:", stat_res) total_count = sum(stat_res.values()) print("实际统计总组合数:", total_count) print("理论总组合数:", sides ** rolls) print("统计是否正确:", total_count == sides ** rolls)
内容的提问来源于stack exchange,提问作者Roy Mustang
相关产品推荐
相关产品推荐

