用的是什么公式
号码池里共 N 个号码,其中 K 个会被抽中(「中奖号」),其余 N − K 个不会。你挑了 n 个。问你挑中的这 n 个里,恰好有 k 个属于中奖号的概率。
取值范围不是简单的 0 ≤ k ≤ n。还得保证两个组合数都有意义:
举个下界不为 0 的例子:N = 10、K = 8、n = 5。非中奖号只有 2 个,你选 5 个,最少也得命中 3 个。
期望与标准差
期望有一个非常干净的形式,而且不需要用到上面那个复杂的分布:
推导用指示变量法:把 X 写成 n 个 0/1 变量之和,第 i 个表示「我选的第 i 个号中了没有」。每个的期望都是 K/N,再用期望的线性性直接相加。这些变量并不独立,但期望的线性性不要求独立——这是它最好用的地方。
方差要麻烦一些,多一个有限总体修正因子:
和二项分布的区别
如果每次抽完把球放回去(有放回),命中数就服从二项分布 B(n, K/N)。区别在于:
| 项目 | 超几何(无放回) | 二项(有放回) |
|---|---|---|
| 抽样方式 | 抽出不放回 | 抽出后放回 |
| 各次是否独立 | 否 | 是 |
| 期望 | nK/N | nK/N(相同) |
| 方差 | 带修正因子 (N−n)/(N−1),更小 | 无修正因子 |
| 适用场合 | 一期内号码不重复 | 每次独立重来 |
两者期望相同,但超几何的方差更小——因为无放回抽样自带「负相关」:抽走一个中奖号,剩下的中奖号就少一个。当 N 远大于 n 时修正因子趋近 1,两者几乎无差别。
「多少分之一」这个说法的陷阱
表格里有一列「约多少分之一」,因为它比小数更直观。但它也最容易被误用。
「一千四百万分之一」不等于「买一千四百万次必中」
独立重复 m 次、每次概率 p,一次都不中的概率是 (1 − p)^m。取 m = 1/p:
(1 − p)^(1/p) → 1/e ≈ 0.3679
也就是说,买满「分母」那么多次,仍有约 36.8% 的概率一次都不中。这个 1/e 与 p 具体是多少几乎无关。
它的另一面同样重要:至少中一次的概率约 63.2%,不是 100%。
关于计算精度
组合数增长极快:C(49,6) = 13,983,816 还算温和,但 C(99,20) 已经超过 4 × 10²⁰,远超 JavaScript 双精度浮点数能精确表示的整数上限 2⁵³ = 9,007,199,254,740,991。
本工具因此分两路计算:
- 组合数用
BigInt大整数逐项计算,结果精确到个位。表格第二列显示的就是精确值。 - 概率在对数域计算——先算
ln C(K,k) + ln C(N−K,n−k) − ln C(N,n),最后取指数。中间量始终是几十量级的小数,不会溢出。
三种常见写法的实际表现,值得分清:
| 写法 | 结果 | 问题 |
|---|---|---|
| 先算阶乘再相除 | 428,786,696,323,047,600,000 | 第 13 位起就错了;且 n ≥ 171 时 n! 溢出为 Infinity,结果变成 NaN |
| 对数域求和再取指数 | 428,786,696,323,046,050,000 | 不会溢出,但同样只有约 15 位有效数字 |
| BigInt 逐项(本工具) | 428,786,696,323,047,746,376 | 精确 |
需要说明的是:概率本身只需十几位有效数字就足够了,所以对数域的做法用来算概率完全没问题,本工具正是这么做的。BigInt 是为了让表格里那一列组合数能一位不差地显示出来——毕竟这类数字的意义就在于精确。
顺带一提,双精度失去精确性的门槛比多数人想象的低:中间档位的组合数在 N 约 55 时就会越过 2⁵³。
这个工具不能做什么
它计算的是概率,不是预测。它能告诉你「命中 3 个的概率是 1.77%」,不能告诉你哪 3 个。
它也不涉及任何具体规则的奖金结构。要判断一组规则划不划算,需要的是返奖率而不是中奖概率——见《期望值与返奖率》,其中的核心恒等式是 E[净收益] = (R − 1) × E[总投注额],与你选哪些号码完全无关。