1.2 概率公理、加法公式与计数技术


1.2 概率公理、加法公式与计数技术

本节摘要:概率的公理化定义只有三条——非负性、规范性、可列可加性,却足以推出全部常用性质(容斥原理、对立事件公式、单调性)。当样本空间有限且等可能时,概率计算退化为"数数":排列组合是数数的兵器谱。本节用帕斯卡亲自算过的"分赌注问题"与"生日攻击"两个案例,把手算与蒙特卡洛互证的流程完整走一遍。

三条公理:整座大厦的地基

1933 年柯尔莫哥洛夫(Kolmogorov)把此前两百八十年零散的概率知识压缩成三条公理。设 P 是把事件映成实数的函数:

  1. 非负性:对任何事件 A,P(A) ≥ 0
  2. 规范性:P(Ω) = 1
  3. 可列可加性:两两互斥的事件列 A₁, A₂, … 满足 P(∪Aᵢ) = ΣP(Aᵢ)

就这三条。但从它们能推出你用的每一条性质,最常用的两条:对立事件公式 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 的有利样本点数 ÷ 样本点总数,概率问题变成计数问题。计数只有两条母原理:分类相加、分步相乘。由它们派生四件兵器:

  • 排列(有序取出):从 n 个取 k 个,数 = n!/(n−k)!
  • 组合(无序取出):从 n 个取 k 个,数 = n!/(k!(n−k)!),记 C(n,k)
  • 有重复排列:k 个独立槽位各 n 种选择,数 = nᵏ
  • 分组与隔板:n 个相同物品分进 r 个槽的方案数

选兵器的判断只看一件事:取出的元素讲究顺序吗。发牌到手讲究顺序吗?不讲究——用组合。逐位生成密码讲究顺序吗?讲究——用排列或重复排列。

案例:帕斯卡的分赌注问题

甲乙各押 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 年的答案当年靠通信往返争论,今天六行代码复现。它教的方法论很重要:中断分注看的是"若继续赌下去"的期望份额,不是已发生的战绩

案例:生日攻击——为什么 23 个人就够

一个房间多少人,能让"至少两人同生日"的概率过半?直觉要 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 的空间里以可观概率撞出碰撞,哈希表与哈希函数安全性的量级估计都从这里出发。

图 1-2 生日悖论曲线:直觉与真实的差距

图 1-2 生日悖论曲线:直觉与真实的差距

顺带补一句几何概型

样本点无穷多但"等可能"仍有意义时,概率退化为长度、面积、体积之比。会面问题(两人随机到达,等不超过 15 分钟的概率)是经典例,答案 1 − (45/60)² = 0.4375。用均匀分布模拟即可复核,思路与前面完全一致,只是把"数点"换成"量面积"。

⚠️ 常见坑:等可能假设必须由试验机制保证,不是"不知道就当等可能"。硬币物理上匀称才有对称性;把"未知参数"当等可能处理是第 6 章贝叶斯估计里要严肃讨论的先验选择问题,不是免费假设。

本节要点回顾

  • 三条公理推出一切:对立事件公式与容斥原理是使用频率最高的两条派生性质
  • 计数先问顺序:有序排列、无序组合、可重复用幂,母原理只有分类相加与分步相乘
  • "至少"型问题优先走对立事件:算补集往往从乘积和变成单项式
  • 分赌注原则:中断分配取决于继续下去的获胜概率,而非已有战绩
  • 生日悖论的量级 √N:碰撞类问题的普适尺度估计
  • 手算 + 模拟互证是全册的标准工作流,本节两个案例都是完整示范

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U