使用方法
- 在「总数 n」填总对象个数,例如从 52 张扑克牌里选,就填
52。 - 在「选取数 k」填要选出的个数,例如选 5 张就填
5。 - 点击「计算组合数」,立即得到 C(n,k) 与排列数 P(n,k),并列出对称项。
- 不确定边界时看提示条:k 超过 n、填了小数或负数,页面会指出具体哪个字段、允许什么范围,不会静默归零。
- 点「复制结果」可把组合数与排列数一起复制;「重置」恢复示例 10 选 3。
这个组合计算器能解决什么问题
组合计算器把"从一组里选法有多少种"变成一个精确整数。典型场景:从 52 张扑克牌抽 5 张有 C(52,5)=2,598,960 种牌型;乐透 49 选 6 有 C(49,6)=13,983,816 种组合;把 23 人分成 3 人小组有 C(23,3)=1771 种分法。它还用于概率分母(有利组合数 ÷ 总组合数)、抽样方案设计、密码学密钥空间估算、以及算法里的组合枚举。
本组合计算器只做"选 k 个不排序"的计数,不负责"按某种顺序排成一列"的排列问题,也不展开具体的组合清单(那会随 n 爆炸式增长)。需要逐条列出所有组合或计算排列数时,请见下方相关工具。
原理与变量说明
设总数为 n、选取数为 k,组合数定义为 C(n,k)=n!/(k!·(n−k)!)。
- 乘积式:页面实际用
∏(n−k+i)/i(i 从 1 到 k)逐项相乘并即时约分,而不是先算三个大阶乘再相除。原因是阶乘到n=170就溢出成Infinity,而很多组合数本身远小于这个数。乘积式把中间值始终压在可控范围,是避开大阶乘溢出的关键角度。 - 对称性:因为
(n−k)!与k!在分母里对称,本页自动取k与n−k中较小者计算,即C(n,k)=C(n,n−k),乘的项更少也更稳。 - 排列数:若顺序也重要,方式数为
P(n,k)=C(n,k)·k!;k 个元素的全排列恰好是k!,所以组合乘以它即得排列。 - 帕斯卡递推:
C(n,k)=C(n−1,k−1)+C(n−1,k),这是杨辉三角(帕斯卡三角)的生成规则,也是动态规划计数的基础。
变量含义:n 为总对象数,k 为选出的个数,k! 为 k 的阶乘。组合数的结果恒为非负整数,单位是个数("种")。
完整示例(数值仅作演示)
示例条件:总数 n=10、选取数 k=3,计算 C(10,3)。
- 乘积式逐步:
(8/1)×(9/2)×(10/3) = 8×4.5×3.333 = 120。 - 组合数 120,即 10 个里无序选 3 个有 120 种选法。
- 对称性
C(10,7)=120,与 C(10,3) 相等(选 3 个留下 7 个,选法一一对应)。 - 排列数
P(10,3)=120×3! = 120×6 = 720,即考虑顺序时排成一列有 720 种。
逐项核对:先乘 8(第 1 项 8/1),再乘 9 除以 2 得 36,最后乘 10 除以 3 得 120。每步都整除,不会出现分数余数。示例中的数值仅用于演示计算过程,不代表任何真实抽取结果。
输入范围与对照表
下表为常见组合数对照,便于直接查用;再下面给出帕斯卡三角前 7 行。
| 组合 | 含义 | C(n,k) 值 |
|---|---|---|
| C(52,5) | 扑克牌抽 5 张的牌型数 | 2,598,960 |
| C(49,6) | 乐透 49 选 6 的组合数 | 13,983,816 |
| C(23,3) | 23 人里选 3 人小组 | 1,771 |
| C(64,2) | 64 个里选 2 个配对 | 2,016 |
| C(10,3) | 本页示例 | 120 |
帕斯卡三角(每行两端为 1,中间每个数等于上一行左右两数之和):
| n=0 | n=1 | n=2 | n=3 | n=4 | n=5 | n=6 |
|---|---|---|---|---|---|---|
| 1 | 1 1 | 1 2 1 | 1 3 3 1 | 1 4 6 4 1 | 1 5 10 10 5 1 | 1 6 15 20 15 6 1 |
边界、精度与对称性说明
- 整数约束:n、k 必须为非负整数,且
0≤k≤n。填小数、负数或 k>n,页面会给出具体哪个字段、允许什么范围。 - 2^53 精度边界:JavaScript 双精度整数精确上限是
2^53−1=9,007,199,254,740,991。本页用 BigInt 输出精确整数,但当结果超过该上限时会提示:二进制浮点表示已不再精确,不能直接当作可加减的精确数。 - 中心二项边界:随 n 增大,中心二项式 C(n,⌊n/2⌋) 最先用尽精度。
C(56,28)=7,648,690,600,760,440仍在安全范围内;从C(58,29)=30,067,266,499,541,040起超过 2^53。著名的大组合数C(66,33)=7,219,428,434,016,265,740(约 7.2×10¹⁸)早已远超,浮点只能给出近似。 - 对称性恒成立:C(n,k)=C(n,n−k) 对任意
0≤k≤n都成立,不是特例;本页借此把计算量减半。 - 乘积式优于阶乘:阶乘在 n=170 就变 Infinity,而乘积式在同样 n 下只算到约 120 项、且每个中间商都是整数,能覆盖大得多的 n。
常见问题
组合和排列到底差在哪?
组合只看"选了哪些",顺序无关;排列还要看"按什么顺序排"。同一组 3 个数,组合里 {A,B,C} 只算 1 种,排列里 ABC、ACB、BAC… 共 6 种(即 3!)。所以 P(n,k)=C(n,k)×k!。本页同时给出两者,方便对照。
为什么用乘积式而不是阶乘?
因为阶乘到 n=170 就溢出成 Infinity,但很多组合数本身并不大。乘积式 ∏(n−k+i)/i 每一步都先乘后除、刚好整除,中间值始终是小整数,既避免溢出又能精确得出结果。这是本页与阶乘计算器在角度上的分工。
C(n,k)=C(n,n−k) 永远成立吗?
成立,对任意 0≤k≤n 都成立。选 k 个留下 n−k 个,两种选法一一对应,所以数量相等。本页计算时自动取较小的一边,既验证对称性又把乘法项数减半。
k 能等于 0 或 n 吗?
可以。C(n,0)=C(n,n)=1:一个都不选、或全选,都只有 1 种方式。k 还能等于 1(C(n,1)=n)或 n−1(C(n,n−1)=n),这些边界值本页都正常返回。
结果超过 2^53 还准吗?
本页用 BigInt 输出的是精确整数。但一旦结果超过 9,007,199,254,740,991,浏览器若把它当成普通数字就会丢精度——例如 C(66,33) 真实末几位是 …5740,浮点只能给到 …6000 量级。页面会明确标出"已超 2^53",此时请把它当作近似值或改用整数库。
能不能列出所有具体组合?
不能,也不建议:C(52,5) 就超过 250 万条,枚举会卡死页面。组合计算器只报"有多少种",具体清单请换用专门的排列组合枚举工具或在本地脚本里生成。
这个工具免费吗?
免费,无需注册即可使用。
输入的数据安全吗?
安全。计算在当前浏览器本地完成,不会上传输入内容,可在开发者工具 Network 面板自查。