本节摘要:概率的公理化定义只有三条——非负性、规范性、可列可加性,却足以推出全部常用性质(容斥原理、对立事件公式、单调性)。当样本空间有限且等可能时,概率计算退化为"数数":排列组合是数数的兵器谱。本节用帕斯卡亲自算过的"分赌注问题"与"生日攻击"两个案例,把手算与蒙特卡洛互证的流程完整走一遍。
1933 年柯尔莫哥洛夫(Kolmogorov)把此前两百八十年零散的概率知识压缩成三条公理。设 P 是把事件映成实数的函数:
就这三条。但从它们能推出你用的每一条性质,最常用的两条:对立事件公式 P(Aᶜ) = 1 − P(A),以及容斥原理 P(A∪B) = P(A) + P(B) − P(A∩B)。后者正是 1.1 节"数两遍"教训的公理化版本——交集部分被加了两次,必须减回一次。三事件版本再多扣一加:P(A∪B∪C) = P(A)+P(B)+P(C) − P(AB) − P(AC) − P(BC) + P(ABC),符号交替,像剥洋葱。
古典概型要求"有限 + 等可能",此时 P(A) = A 的有利样本点数 ÷ 样本点总数,概率问题变成计数问题。计数只有两条母原理:分类相加、分步相乘。由它们派生四件兵器:
选兵器的判断只看一件事:取出的元素讲究顺序吗。发牌到手讲究顺序吗?不讲究——用组合。逐位生成密码讲究顺序吗?讲究——用排列或重复排列。
甲乙各押 32 枚金币赌掷硬币,先赢 3 局者拿走全部 64 枚。甲已胜 2 局、乙已胜 1 局时赌局被迫中断,怎么分才公平?按"已赢局数比例 2:1"分是直觉错误。正确思路:继续设想后面的比赛,甲最终获胜 = "下一局甲胜" 或 "下一局乙胜且再下一局甲胜" 或 "下两局乙都胜后第三局甲胜"之外……更干净的办法是数样本空间:最多再赛 2 局,共 4 种等可能结果,其中甲获胜的占 3 种。所以甲应得 64 × 3/4 = 48 枚,乙得 16 枚,比例 3:1 而不是 2:1。
from itertools import product from fractions import Fraction # 设想最多再赛两局,每局甲胜记 1,乙胜记 0 space = list(product([1, 0], repeat=2)) win_A = [s for s in space if sum(s) >= 1] # 两局内甲至少胜一局即最终夺冠 p_A = Fraction(len(win_A), len(space)) print("甲获胜概率:", p_A) # 3/4 print("甲分得金币:", 64 * p_A, " 乙分得:", 64 * (1 - p_A)) # 48 / 16
这个 1654 年的答案当年靠通信往返争论,今天六行代码复现。它教的方法论很重要:中断分注看的是"若继续赌下去"的期望份额,不是已发生的战绩。
一个房间多少人,能让"至少两人同生日"的概率过半?直觉要 180 人,实际 23 人。手算走对立事件:n 人全不同生日的概率 = 365/365 × 364/365 × … × (365−n+1)/365,"至少两人相同" = 1 减它。这里"至少"触发了对立事件公式,连续乘积触发了分步乘法原理——两条公理性质的实战。
import numpy as np from math import comb def birthday_prob(n): # 对立事件:n 人生日两两不同 p_diff = 1.0 for k in range(n): p_diff *= (365 - k) / 365 return 1 - p_diff for n in [10, 23, 30, 50, 60]: print(f"n={n:3d} 至少两人同生日概率 {birthday_prob(n):.4f}") rng = np.random.default_rng(7) n, trials = 23, 100_000 sims = rng.integers(0, 365, size=(trials, n)) # 每次模拟中是否存在重复生日:唯一值个数少于 n 即有重复 dup = (np.array([len(np.unique(row)) for row in sims]) < n).mean() print("n=23 蒙特卡洛模拟:", round(dup, 4)) # 约 0.507,对照手算 0.5073
手算 n=23 给 0.5073,模拟给 0.507 上下——一致。这个结论是密码学生日攻击的根基:只需约 √N 次尝试就能在大小为 N 的空间里以可观概率撞出碰撞,哈希表与哈希函数安全性的量级估计都从这里出发。

样本点无穷多但"等可能"仍有意义时,概率退化为长度、面积、体积之比。会面问题(两人随机到达,等不超过 15 分钟的概率)是经典例,答案 1 − (45/60)² = 0.4375。用均匀分布模拟即可复核,思路与前面完全一致,只是把"数点"换成"量面积"。
⚠️ 常见坑:等可能假设必须由试验机制保证,不是"不知道就当等可能"。硬币物理上匀称才有对称性;把"未知参数"当等可能处理是第 6 章贝叶斯估计里要严肃讨论的先验选择问题,不是免费假设。