组合计算器
欢迎使用组合计算器。请输入元素数量(n)以及抽取数量(k 或 r)。在下方的框中选择是否允许重复。然后点击“计算”按钮。
组合计算公式
组合表示的是从 n 个元素中选取 k 个元素的情况。它通常称为从 n 取 k 的组合,不要与从 n 取 k 的排列混淆。在组合中,所选择元素的顺序不重要,而在排列中,顺序是重要的。
从一个包含 n 个元素的集合中选取 k 个元素,一共有多少种不同的方式?不允许重复的从 n 取 k 的组合(即每次选取后,该元素会从可选集合中移除,不能再次被选取)通常记作 在许多资料中,也会使用记号 或者 其中后者尤为常见。因此,我们可以写成
其中 n! 表示 n 的阶乘。另一方面,允许重复的从 n 取 k 的组合(即选取的元素会返回到集合中,可以被再次选取)通常记作 ,有时也会写成
不允许重复的组合与不允许重复的排列之间满足如下关系式:
之所以要将排列的数量除以 k!,是因为在组合中元素的顺序并不重要,而在排列中顺序则是重要的。如果你关注的场景中,所选元素顺序会产生影响,请查看我们的排列计算器。
组合的示例
100个人一共会产生多少次握手?
假设你刚到一个鸡尾酒会,现场共有100位来宾(包括你自己)。在每个人都与其他所有人握手致意时,你不禁会好奇:一共会产生多少次握手呢?
这里共有 n = 100个人。在这个群体中,可以组成多少对不同的两人组合?换句话说,从100取2的组合的数量是多少?答案是
因此,一共会产生4950次握手。需要注意的是,这里使用的是不允许重复的组合,因为一个人不可能与自己握手!
能获得多少种扑克牌手牌?
我们要考虑扑克牌中不包含大小王的情况,也就是说,牌组共有52张牌。从中抽取五张牌,且不允许重复(因为同一张牌不可能被抽到两次)。同时,牌的顺序并不重要。因此,这里可以使用不允许重复的从 n 取 k 的组合,其中 k = 5,n = 52,其计算公式为
由此可知,一副扑克牌可以产生2,598,960种不同的手牌。在此基础上,我们就可以进一步计算各种牌型出现的概率。
获得四条牌型的概率
要组成四条牌型,首先需要选择重复的牌的点数(共有13种可能),然后再选择第五张牌(共有48种可能)。因此,一共有 种不同的四条手牌组合。由此可得,随机拿到一手四条的概率为
获得葫芦牌型的概率
计算获得一手葫芦牌型的概率要复杂一些。首先,需要选择对子所对应的点数(共有13种可能),以及三条所对应的点数(共有12种可能,不能与对子相同,因此少了一个点数可选)。接下来,还需要考虑花色的不同组合:对子有 种花色组合,三条有 种花色组合。将这些数量相乘,就可以得到总的可能出现葫芦牌型的组合数量:
一共有3744种不同的葫芦手牌,因此随机拿到一手葫芦牌型的概率为 这意味着,拿到葫芦的可能性大约是拿到四条的6倍。
获得同花牌型的概率
同花是指五张牌都属于同一种花色。首先需要选择花色——共有4种可能。然后,从该花色的13张牌中选取5张,一共有 种选择方式。综合计算得出,能产生
种不同的同花手牌。随机拿到一手同花牌型的概率为
注意!上述公式包含获得同花顺牌型的情况。同花顺是一种特殊的同花,不仅花色相同,牌面点数还必须连续排列。如果你想计算不包含同花顺的“普通同花”的概率,就需要从上面得到的概率中减去同花顺的概率(见下文)。
获得顺子牌型的概率
这里我们期望得到的是得到一组由5张牌组成的顺子——也就是说,每张牌的点数都比前一张高1,而不考虑花色。要计算这种手牌的数量,首先需要确定顺子中的最大牌点数。最大牌可以是 A、K、Q、J、10、9、8、7、6或5(其中 A 也可以作为5-4-3-2-A 顺子中的最小牌),因此,最大牌点数一共有10种选择。一旦确定了最大牌,其余牌的点数也就随之确定。接下来需要为这5张牌选择花色。每张牌都有4种花色可选,我们需要为5张牌分别选定花色。因此,这一步相当于计算允许重复的从4取5的排列,其公式为45。由此可得,能得到
种顺子手牌。随机拿到一手顺子牌型的概率为
注意!上述公式同样包含了获得同花顺牌型的情况。同花顺是一种特殊的顺子,不仅牌面连续,而且花色相同。如果你想计算不包含同花顺的“普通顺子”(即花色不全相同的顺子)的概率,就需要从上面计算得到的概率中减去同花顺的概率(见下文)。
获得同花顺牌型的概率
同花顺是扑克牌中最珍贵、也最罕见的牌型之一。在这套手牌中,牌面点数是连续的(就跟顺子牌型一样),同时所有牌还必须属于同一种花色(就跟同花牌型一样)。要计算这种手牌的数量,首先需要确定顺子中的最大牌点数。与普通顺子一样,这里共有10种选择方式。确定牌点数之后,还需要选择花色,共有4种花色可以选择。综合以上因素,最终得到的计算公式为
这样的手牌一共只有40种,因此随机拿到一手同花顺牌型的概率为
注意!上述公式也包含了获得皇家同花顺的情况(见下文)。如果你想计算不包含皇家同花顺的“普通同花顺”的概率,就需要从上面得到的概率中减去皇家同花顺对应的概率。
获得皇家同花顺手牌的概率
获得皇家同花顺牌型的概率比同花顺还要低,因为皇家同花顺是最大牌为 A 的同花顺。因此,皇家同花顺中的牌点数固定为 A、K、Q、J 和10,唯一可能变化的只有花色。由于花色只有4种,因此皇家同花顺一共只有4种不同的手牌牌型。随机拿到一手皇家同花顺的概率为 这是获得同花顺概率的十分之一。
获得三条牌型的概率
要组成一手三条,首先需要选择三张同点数牌的点数,共有13种可能。接下来,从剩余的12个点数中选择另外两张牌的点数。这里必须确保不会形成对子(否则就会变成葫芦),因此计算的是不允许重复的从12取2的组合,即 然后需要确定花色。首先为三张相同点数的牌选择花色,有 种选法。接着为剩下的两张牌选择花色——由于它们点数不同,因此可以独立选择花色,相当于计算允许重复的从4取2的排列,结果有42种。综合以上各步,最终得到的计算公式为
随机拿到一手三条牌型的概率为
获得两对牌型的概率
有多少种不同的方式可以组成一手两对?牌呢?首先,需要选择两对所对应的点数,有 种选择方式。其次,需要为第五张牌选择一个不同于前两对的点数,这里共有 种可能。接下来,需要确定每一对牌的花色。在每一对中,两张牌的花色必须不同,因此低点数对子有 种花色选择方式,高点数对子也有 种花色选择方式。最后,还需要为第五张牌选择花色,这一步有4种可能。将上述所有因数相乘,就可以得到总的可能数:
随机拿到一手两对牌型的概率为
获得对子牌型的概率
最后,我们来计算获得对子牌型的概率,计算步骤如下:1)选择对子对应的点数:共有 种方式;2)从剩余的点数中选择另外三张牌的点数:共有 种方式;3)为对子中的两张牌选择花色:共有 种方式;4)为剩余三张牌分别选择花色:共有43种方式。你可能会疑惑:为什么在选择这三张不同点数牌的点数时使用的是组合(即 ),而在选择它们的花色时却使用排列(即43)呢?原因在于:在选择点数时,牌在手牌中的顺序并不重要。即使改变牌的顺序,得到的仍然是同样的手牌,因此使用组合计算。但这三张牌的点数各不相同,本身就存在自然的顺序,可以从大到小排列,我们可以利用这一顺序来区分这三张牌,从而依次为最高点数的牌、中间点数的牌以及最低点数的牌选择花色。每一步都有4种选择,因此总共有种可能。
因此,对子手牌存在数量为
而且随机拿到一手对子牌型的概率为 你也可以通过实验来验证这一结果:洗牌后抽取五张牌。你抽到对子牌了吗?记录你得到的结果。多重复几次,你会发现得到对子的情况略少于一半。
中彩票的概率有多大?
许多国家都有售卖选号型彩票,在这种玩法中,需要从较大的号码池中随机抽取若干个号码。只要你选对了这些号码,就可能中奖——而奖金通常非常丰厚。以中国非常流行的中国体育彩票“大乐透”为例:在这种彩票中,你需要从01到35的号码中选出5个不同号码,然后再从01到12的号码中选出2个不同号码。这种组合方式的所有可能数目是:
因此,在体彩“大乐透”中,选号方式一共有21,425,712种。换句话说,若想确保中得头奖,理论上需要购买21,425,712注彩票。如果只购买一注,那么中奖的概率为21,425,712分之1,约等于0.00000467%。
带去聚会的零食有多少种不同的可能?
在这个示例中,设想你要去朋友家参加一个聚会,并被邀请带一些零食。可供选择的零食共有三种:薯片、瓜子和巧克力。你打算购买5袋零食,那么一共有多少种不同的搭配方式呢?
首先,我们注意到可供选择的元素有3种,因此 n = 3。其次,零食的排列顺序并不重要。第三,每一种零食都可以购买多袋,也就是说允许重复选择。因此,这里应当计算允许重复的从3取5的组合,其计算公式为
计算结果表明,为这次聚会带去的零食一共有21种不同的搭配方式。为了验证结果是否正确,我们可以列出所有可能的组合(为简化说明,这里用 A、B、C 来表示三种零食):
组合计算公式详解
不允许重复的从 n 取 k 的组合
不允许重复的从 n 取 k 的组合(有时也称为“n 取 k”或“n 取 r”)的计算公式为
为了验证该公式是否确实正确,我们可以检验从1到 n 中选取 k 个数的过程。首先,将所选的数字放入一个长度为 k 的序列中。序列的第一个位置可以由 n 个数字中的任意一个占据;当第一个数字被选中并从可选集合中移除后,第二个位置就只剩下 n − 1种选择。同样地,第二个数字选定并移除后,第三个位置可选的数字数量变为 n − 2。我们以这种方式不断进行选择,直到填满整个长度为k 的序列。要想知道这类序列的所有存在的排布数量(这恰好等于不允许重复的从 n 取 k 的排列的数量),就需要将每一步可选的数量相乘:
换个角度看,这个乘积等同于某个阶乘中最大的 k 个因数相乘。因此,我们可以将其改写为
其中分母中的阶乘会消去分子中最小的 n − k 个乘数因数,剩余部分正好与前面得到的公式一致。
不过,事情并没有到此为止,因为到目前为止,我们计算得到的仍然是排列的数量,而不是组合的数量。在排列中,元素的顺序是重要的;在构造序列时,我们确实关心顺序——先选择第一个位置的数字,再选择第二个、第三个,依此类推。现在,我们希望将由同一组数字组成、仅顺序不同的所有序列视为同一个组合。那么,使用 k 个不同数字可以构成多少种不同的序列呢?答案很简单:是 k! 种不同的排列。因此,要得到组合的数量,就需要将排列的数量除以 k!:
允许重复的从 n 取 k 的组合
如何推导允许重复的从 n 取 k 的组合公式?由于 n 个元素中的每一个都可以被选取0到 k 次,我们可以这样想象:有 n 个盒子,编号从1到 n。每个盒子里最多有 k 个球,并且所有盒子里的球加起来一共是 k 个。这些盒子对应各个元素,而某个盒子里的球数则表示我们选取该盒子所代表的元素的次数。
那么,如何用一个数列来描述每个盒子里有多少个球呢?我们可以构造一个由 n − 1个数组成的序列,其构造方式如下:该序列中的第 i 个数表示从第1个盒子到第 i 个盒子为止,盒子数量与球的数量之和。例如,序列中的第一个数等于1加上第一个盒子里的球数(因此其取值范围是1到 k + 1)。第二个数等于2加上前两个盒子里的球数(因此其取值范围是2到 k + 2,并且必须大于第一个数)。第三个数等于3加上前三个盒子里的球数(取值范围是3到 k + 3,并且必须大于第二个数)。依此类推。不难看出,该序列最后一个数的值等于 n − 1加上除最后一个盒子之外所有盒子中的球数。它的最小值为 n − 1(当所有球都在最后一个盒子中时),最大值为 n − 1 + k(当最后一个盒子中没有球时)。
现在,我们换一个角度来看这个问题。设有一个由1到 n − 1 + k 组成的数集。从这个数集中,我们在不允许重复的情况下选取 n − 1个数,并按从小到大的顺序排列成一个序列。这样一来,我们就可以确定每个盒子中放进多少个球。实际上,从包含 n − 1 + k 个数的集合中选取 n − 1个数的每一种选法,都与将 k 个球分配到 n 个盒子中的某一种分配方式对应。那么,从 n − 1 + k 个数中不重复地选取 n − 1个数,一共有多少种可能呢?答案是
这几乎已经得到我们要找的公式了。最后一步需要注意的是,分母中两个阶乘的顺序是可以互换的,也就是说,可以写成
最后得到
杨辉三角与二项式系数
二项式是指包含两个项的代数式,例如 当我们将 提升到一个非负整数次幂时,出现在 x 和 y 前面的那些数就称为二项式系数。例如, ——在这些例子中,对应的二项式系数分别是:1、1-1、1-2-1,以及1-3-3-1。我们可以发现,二项式系数与从 n 取 k 的组合之间存在密切关系:当我们展开 时,位于 前面的系数正是 例如,在 中, 前面的系数是 这一关系可以用如下通式来表示:
此外,二项式系数还呈现出一种有趣的规律——它们可以排列成一个三角形,通常称为“杨辉三角”:
| n | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | ||||||||||
| 1 | 1 | 1 | |||||||||
| 2 | 1 | 2 | 1 | ||||||||
| 3 | 1 | 3 | 3 | 1 | |||||||
| 4 | 1 | 4 | 6 | 4 | 1 | ||||||
| 5 | 1 | 5 | 10 | 10 | 5 | 1 | |||||
| 6 | ⋯ | ||||||||||
杨辉三角的一个有趣特征是:后一行中的每个数,都可以通过将上一行中相邻的两个数相加得到。例如,在 n = 4这一行中的6,来源于上一行中的3 + 3;同样地,n = 5这一行中的10,来自其上一行中的4 + 6。这个规律可以用如下等式来概括:
二项式方程与恒等式
下面列出了一些最常见、最著名的二项式系数恒等式:
在 Python 中计算从 n 取 k
在 Python 编程语言中,如果要计算不允许重复的从 n 取 k 的组合的数量,可以使用 math 模块中的 comb 函数:
from math import comb
def nCk(n, k):
return comb(n, k)
如果要计算允许重复的从 n 取 k 的组合的数量,可以使用将允许重复的组合与不允许重复的组合联系起来的公式:
from math import comb
def nEk(n, k):
return comb(n + k - 1, k)
如果你想要列出所有不允许重复的从 n 取 k 的组合,Python 也提供了一个内置函数可以直接实现这一点:
from itertools, import combinations
def list_combs(n, k):
for c in combinations(range(1, n+1), k):
print(c)
而如果要列出所有允许重复的从 n 取 k 的组合,可以使用:
from itertools import combinations_with_replacement
def list_combs_wr(n, k):
for c in combinations_with_replacement(range(1, n+1), k):
print(c)
如果你想自行编写一个函数来计算不允许重复的从 n 取 k 的组合的数量,下面是一个示例:
from math import factorial
def nCk(n, k):
return int(factorial(n) / (factorial(k) * factorial(n-k)))
如果要计算允许重复的从 n 取 k 的组合数量,你也可以使用如下函数实现:
from math import factorial
def nEk(n, k):
return int(factorial(n + k - 1) / (factorial(k) * factorial(n-1)))
如何使用组合计算器
组合计算器可用于计算允许重复和不允许重复的从 n 取 k 的组合。若要进行计算,请在标有字母 n 的栏中输入可选元素的数量,然后在标有 k 或 r 的栏中输入抽取次数。如果需要计算允许重复的组合,请勾选下方的复选框。最后,点击“计算”按钮,结果将显示在下方。
这款计算器尤其适合处理涉及超大数值的计算。例如,输入 n = 1000000 且 k = 1000时也不会有问题。对于较大的结果,计算器会以两种形式显示:第一行给出采用科学记数法表示的近似值,第二行显示精确结果。
这款计算器没有预设的输入上限,会尝试计算任意大小的 n 和 k。计算是否能够顺利完成,取决于你的系统配置。在桌面设备上,较新的 Chrome 浏览器通常可以轻松计算诸如 n = 8000000000、k = 10000000这样的输入项(例如:在小行星撞击地球后,从全球人口中选出10,000,000名幸存者登上巨型飞船)。但是,在其他系统环境下,尤其是在移动设备上,如此大的数值可能会导致计算变慢,甚至无法完成。
这款计算器还提供了一些其他功能,你可以:
- 选择结果以哪个底数显示。你可以使用2到36之间的任意自然数。默认底数为10,也就是以十进制形式显示结果。如果选择了其他底数,该底数仅用于结果显示;输入的数值始终按十进制读取。
- 若要清空 n 和 k 的输入值,点击“清除”按钮,然后重新输入所需的数值。
- 将结果复制到剪贴板。若要使用此功能(以及以下所有功能),请点击位于“结果”栏上方的相应按钮。
- 将结果下载并以文本文件形式保存到你的设备中。
- 打印结果。
- 将结果页面的链接复制到剪贴板。
- 清空结果。
引用或嵌入本内容
你可以免费使用本网站的内容,包括用于商业用途,但需注明本网站为来源。如果你在学术文本中引用本内容,可使用以下参考文献格式:
如需在互联网上引用本网站,可以直接链接主网址(https://
你也可以使用 iframe 元素将本页面嵌入到你的网站中。如果你只想要在页面中展示计算器,隐藏其余内容(如菜单、文章等),可以在 iframe 的 src 属性中使用以下网址:https://
请在你的网站上附上可点击的链接,注明并引用本页面。你也可以发送电子邮件至 contact@simiade.com 告知我们你已在网站中嵌入了我们的应用。这样一来,如果我们对应用进行了更新,更新结果可能影响网站的展示方式,我们会及时通知你,方便你的网站管理员作出相应调整。
参考文献
Charalambides, Charalambos A., Enumerative Combinatorics, CRC Press, 2002.
联系我们
如果你有任何疑问、意见或者建议,请在此留下你的反馈意见:
或者你也可以通过邮件联系我们:
Adam Narkiewicz
Plac Bankowy 2
00-095 Warszawa
波兰
+48 728235409
contact@simiade.com
https://simiade.com/zh/
