交互工具

组合概率计算器

N 个号码里抽出 K 个,你事先选了 n 个, 问命中 k 个的概率是多少。这是超几何分布, 答案是纯组合计算,一支笔就能算,只是数字大了容易出错。

纯前端计算,不上传任何数据 组合数用大整数精确计算 配套阅读:组合数学

2 – 200
1 – N
1 – N
 
 

总组合数 C(N, n)

正在计算…

期望命中数 E[X]

正在计算…

标准差 σ

正在计算…

全部命中的概率

正在计算…

命中个数的概率分布

超几何分布 X ~ Hypergeometric(N, K, n)。

完整分布表
命中 k 个 组合数(精确) 概率 P(X = k) 约多少分之一 P(X ≥ k)

用的是什么公式

号码池里共 N 个号码,其中 K 个会被抽中(「中奖号」),其余 N − K 个不会。你挑了 n 个。问你挑中的这 n 个里,恰好有 k 个属于中奖号的概率。

P(X = k) = C(K, k) · C(N − K, n − k) / C(N, n) 超几何分布。分子:从 K 个中奖号里挑 k 个 × 从 N−K 个非中奖号里挑 n−k 个;分母:所有挑法。

取值范围不是简单的 0 ≤ k ≤ n。还得保证两个组合数都有意义:

max(0, n − (N − K)) ≤ k ≤ min(n, K) 下界:如果 n 比非中奖号总数还多,那你被迫至少命中若干个。

举个下界不为 0 的例子:N = 10K = 8n = 5。非中奖号只有 2 个,你选 5 个,最少也得命中 3 个。

期望与标准差

期望有一个非常干净的形式,而且不需要用到上面那个复杂的分布

E[X] = n · K / N

推导用指示变量法:把 X 写成 n 个 0/1 变量之和,第 i 个表示「我选的第 i 个号中了没有」。每个的期望都是 K/N,再用期望的线性性直接相加。这些变量并不独立,但期望的线性性不要求独立——这是它最好用的地方。

方差要麻烦一些,多一个有限总体修正因子:

Var(X) = n · (K/N) · (1 − K/N) · (N − n) / (N − 1) 最后那一项就是修正因子。若改为有放回抽样,它消失,退化成二项分布的方差。

和二项分布的区别

如果每次抽完把球放回去(有放回),命中数就服从二项分布 B(n, K/N)。区别在于:

超几何分布与二项分布
项目超几何(无放回)二项(有放回)
抽样方式抽出不放回抽出后放回
各次是否独立
期望nK/NnK/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/ep 具体是多少几乎无关。

它的另一面同样重要:至少中一次的概率约 63.2%,不是 100%。

概率不会累积

连续多次未中,不会让下一次的概率上升。每一次都是全新的 p

这是独立性的直接推论,误解它就是赌徒谬误

关于计算精度

组合数增长极快: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),最后取指数。中间量始终是几十量级的小数,不会溢出。

三种常见写法的实际表现,值得分清:

计算 C(99,20) 的三种写法(精确值 428,786,696,323,047,746,376)
写法结果问题
先算阶乘再相除 428,786,696,323,047,600,000 第 13 位起就错了;且 n ≥ 171n! 溢出为 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[总投注额],与你选哪些号码完全无关。