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

概率加法/乘法规则验证疑问:两种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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:45:12