概率加法/乘法规则验证疑问:两种Python实现结果不一致求解
双骰子概率计算:两种方法的正误分析
结论
Pandas枚举所有可能结果的方法正确,最终结果7/12符合实际概率;NumPy的计算方法错误,得出的2/3是错误结果。
核心错误点:混淆事件的定义
你忽略了概率公式中事件的本质:加法规则里的A和B是双骰子联合样本空间(共36种结果)中的事件,不是单个骰子样本空间的独立集合:
- A是「第一个骰子掷出1」,对应联合空间里的6种结果:(1,1)、(1,2)、(1,3)、(1,4)、(1,5)、(1,6)
- B是「第二个骰子掷出偶数」,对应联合空间里的18种结果:所有(d1,2)、(d1,4)、(d1,6)(d1取1-6)
- A∩B是「d1=1 且 d2是偶数」,对应联合空间里的3种结果:(1,2)、(1,4)、(1,6),其概率为3/36=1/12
你的NumPy代码错误地将A、B当成单个骰子的取值集合,用np.intersect1d判断两个单骰子取值集合无交集,就认为P(A and B)=0,但这完全误解了联合事件的交集定义——两个独立骰子的事件交集,是看联合结果中同时满足两个条件的情况,而非单个骰子的取值是否重叠。
正确的公式计算验证
按照概率加法规则:
P(A or B) = P(A) + P(B) - P(A and B)
代入数值:
= 1/6 + 1/2 - (1/6 × 1/2) = 1/6 + 3/6 - 1/12 = 4/6 - 1/12 = 8/12 - 1/12 = 7/12
结果与Pandas枚举法一致。
两种代码对比
错误的NumPy实现
import numpy as np from fractions import Fraction d1 = np.arange(1, 7) d2 = np.arange(1, 7) np_1 = d1[d1 == 1].size / d1.size # 等于1/6 np_even = d2[d2 % 2 == 0].size / d2.size # 等于1/2 np_1_or_even = ( np_1 + np_even - (np_1 * np_even * (np.intersect1d(d1[d1 == 1], d2[d2 % 2 == 0]).size > 0)) ) print(Fraction(np_1_or_even).limit_denominator(100))
正确的Pandas实现
import numpy as np import pandas as pd from fractions import Fraction dice_outcomes = np.arange(1, 7) two_dices_outcomes = np.array([(i, j) for i in dice_outcomes for j in dice_outcomes]) df = pd.DataFrame(columns=["d1", "d2"], data=two_dices_outcomes) r = df[(df["d1"] == 1) | (df["d2"] % 2 == 0)].size / df.size print(Fraction(r).limit_denominator(100))
内容的提问来源于stack exchange,提问作者7mza
相关产品推荐
相关产品推荐

