基于Monte Carlo模拟计算掷骰子Two-Pairs概率(Python)
问题分析与修正方案
你的代码核心问题是完全误解了Two-Pairs的定义和试验逻辑,具体问题如下:
- 错误将“多次掷两个骰子的成对次数”等同于Two-Pairs,但实际需求是一次掷n个骰子的结果中,存在至少两组不同的数值各出现2次及以上(比如掷5个骰子出
[2,2,3,3,5]或[2,2,2,3,3]都符合条件)。 roll_dice函数存在逻辑漏洞:当两个骰子点数不同时,函数未显式返回False,默认返回None,虽不影响布尔判断,但属于不规范写法。- 试验流程错误:当前逻辑是“每次试验掷n次两个骰子,统计成对次数≥2就算Two-Pairs”,和你要实现的“n个骰子中出现Two-Pairs”完全不是同一场景。
修正后的代码
import random from collections import Counter def two_pair_prob(n_dice, n_trials): count_two_pairs = 0 for _ in range(n_trials): # 单次试验:生成n个骰子的点数结果 dice_rolls = [random.randint(1, 6) for _ in range(n_dice)] # 统计每个点数的出现次数 freq = Counter(dice_rolls) # 统计出现次数≥2的点数种类数 valid_pairs = sum(1 for cnt in freq.values() if cnt >= 2) # 判断是否满足Two-Pairs条件:至少2种不同点数各出现≥2次 if valid_pairs >= 2: count_two_pairs += 1 # 返回概率估算值 return count_two_pairs / n_trials
代码说明
- 用列表推导式生成单次试验中n个骰子的所有点数,符合“一次掷n个骰子”的试验场景。
Counter工具快速统计每个点数的出现次数,比手动计数更简洁高效。- 统计出现次数≥2的点数种类数,只要该数量≥2,就满足你定义的Two-Pairs要求。
- 经过n次试验后,用满足条件的次数除以总试验次数,得到概率的估算结果。
内容的提问来源于stack exchange,提问作者jack koteles
相关产品推荐
相关产品推荐

