排列组合中两两配对问题的分析

在等可能概型中,有一类问题是球放盒子问题,比如把m个球,放在n(n >=m )个盒子中,计算各种情况的概率,这类问题难点在于排列组合的运算,下面按照从易到难的情况对这类问题进行分析:

1、每个盒子只能放一个球

计算每个盒子最多只能放一个球的概率,首先来看下这个问题的解题思路:
每个球可以放n个盒子,因此m个球的样本空间的样本个数N(S)= n m n^{m} nm
第一个球可以选n个位置
第二个球可以选n-1个位置
….
第m个球可选n-m+1个位置
N(A)=n*(n-1)(n-m+1)= P n m P_n^m Pnm
p(A)= P n m n m \frac{P_n^m}{n^{m}} nmPnm
这个问题很简单,不用多解释

2、每个盒子可以放多个球

如果把问题复杂化一点,每个盒子可以放多个球,要求所有的球放i个盒子的概率怎么计算呢,下面就来研究一下

为了便于问题分析,先把n和m具体化,并且设置小一点方便计算,就假设要求是共3个盒子,4个球,放在2个盒子中;这种情况下,就有两种分法,第一种是一个盒子放1个球,另一个放3球(1+3);第二种是2+2,下面分别进行计算分析。

2.1 1+3的情况

先计算1+3的情况,首先在4个球中选1个就是 C 4 1 C_4^1 C41,这个球有3个盒子可选就是 C 3 1 C_3^1 C31,剩下的3个球选3个是 C 3 3 C_3^3 C33,有2个盒子可选是 C 2 1 C_2^1 C21
这种情况的N= C 4 1 C 3 1 C 3 3 C 2 1 C_4^1C_3^1C_3^3C_2^1 C41C31C33C21,而且可以把 C 3 1 C 2 1 C_3^1C_2^1 C31C21组合起来就是 P 3 2 P_3^2 P32,这个怎么理解呢,其实就是有两组球,放在3个盒子中进行排列运算的结果;而 C 4 1 C 3 3 C_4^1C_3^3 C41C33就是4个球分成1+3两组的组合结果,根据运算公式得到最终的样本个数是24个,列个表格来验证一下结果:

box1box2box3
1234
1234
2341
1234
2341
2341

如表格所示(1,234)的放置方法共有6种,而(2,134),(3,124),(4,123)四种分法也不会有重复,因此计算的结果24是正确的;

2.2 2+2的情况

下面来计算2+2的情况,按照前面的思路,N= C 4 2 C 3 1 C 2 2 C 2 1 C_4^2C_3^1C_2^2C_2^1 C42C31C22C21,或者N= C 4 2 C 2 2 P 3 2 C_4^2C_2^2P_3^2 C42C22P32=36,还是列一张表,来验证一下结果:

box1box2box3
1234
1234
3412
1234
3412
3412
1324
1324
2413
1324
2413
2413
1423
1423
2314
1423
2314
2314

然而表格统计的结果只有18个,刚好是之前运算结果的一半,问题出在哪里?

首先看 P 3 2 P_3^2 P32,两组数,3个位置,并且有顺序,所以没有问题。
再来看下 C 4 2 C 2 2 C_4^2C_2^2 C42C22,按照理解应该是先从4个数种选2个,再从剩下的2个种选2个,集合是这样的{(12,34),(13,24),(14,23),(23,14),(24,13),(34,12)},但是当把这个集合的数拿到盒子中做组合运算就会重复,因为(12,34)和(34,12)是等价的,实际的结果应该是{(12,34),(13,24),(14,23)},这之间差的2倍实际上就是2个组的全排列 P 2 2 P_2^2 P22,注意这里的2是两个组的那个2,而不是每个组中2个数字的那个2;

由于两组数的个数相同, C 4 2 C 2 2 C_4^2C_2^2 C42C22的计算方法暗含了一个根据组数进行的全排列,因此在运算时要把 P 2 2 P_2^2 P22除掉,再次强调这里的2是组的个数,最后得到的结果是:N= C 4 2 C 2 2 P 2 2 P 3 2 \frac{C_4^2C_2^2}{P_2^2}P_3^2 P22C42C22P32 =18

最后汇总1+3和2+2的两种情况,分两组的样本个数为N= C 3 1 C 2 1 P 3 2 + C 4 2 C 2 2 P 2 2 P 3 2 C_3^1C_2^1P_3^2+\frac{C_4^2C_2^2}{P_2^2}P_3^2 C31C21P32+P22C42C22P32,后面计算概率除以样本总数就不再赘述了。

3、一般情况

推广到更普遍的情况,n个组,每组k个数(所有数字不重复)的组合的总数为:
N= ∏ i = 0 n − 1 C n k − i k k P n n \frac{\prod_{i=0}^{n-1}C_{nk-ik}^k}{P_n^n} Pnni=0n1Cnkikk,(这个要用归纳法去证明,限于时间精力有限就不想证明了,结果应该是对的),而之前1+3的情况,1和3都只有一组,按照这个公式把 P 1 1 {P_1^1} P11带进去也是正确的;

如果要在m个容器中进行放置,就再乘以 P m n P_m^n Pmn进行排列,如果要运算概率,就再除以N(S)= m n k m^{nk} mnk

另外网上看到很多人问两两组合的问题,比如6个数两两组合有多少情况,网上很多答案是 C 6 2 C_6^2 C62,结果15是对的,但是算法错了,应该是 C 6 2 C 4 2 C 2 2 P 3 3 = 15 \frac{C_6^2C_4^2C_2^2}{P_3^3}=15 P33C62C42C22=15

以上就是对于多个数进行k*n分组的情况下,计算排列组合以及概率的一些分享,希望能对大家有帮助。

### Python 中使用 `itertools` 实现排列组合 #### 组合 (Combinations) 当需要生成给定长度的组合时,可以使用 `itertools.combinations()` 函数。此函数接受两个参数:第一个是要从中选取元素的对象(通常是可迭代对象),第二个是每个组合中的元素数量。 ```python import itertools # 例子:从 'ABCD' 中选出 2 个字符的所有可能组合 combinations = list(itertools.combinations('ABCD', 2)) print(combinations) ``` 上述代码会输出所有由字符串 `'ABCD'` 的不同两两配对形成的元组列表[^1]。 #### 带重复项的组合 (Combinations with Replacement) 如果允许同一个元素被多次选中,则应采用 `itertools.combinations_with_replacement()` 方法来获取带替换的选择方式: ```python import itertools # 例子:从 'ABCD' 中选出 3 个字符的所有带有重复选项的组合 repeated_combinations = [''.join(c) for c in itertools.combinations_with_replacement('ABCD', 3)] print(repeated_combinations) ``` 这段程序将会打印出所有的三重组合,其中某些位置上的字母可能是相同的[^2]。 #### 排列 (Permutations) 为了获得指定大小的不同顺序下的子集序列,即所谓的全排列或者部分排列,应该调用 `itertools.permutations()` 来完成这项工作: ```python import itertools # 例子:计算并显示来自 'ABC' 字符串的所有双字符排列情况 permutations = [''.join(p) for p in itertools.permutations('ABC', 2)] print(permutations) ``` 这里展示了如何利用该功能枚举出任意一对字符之间的所有不同的排序形式[^4]。 通过以上介绍可以看出,在面对涉及大量数据的操作时,`itertools` 提供了一种简洁而高效的方式来解决各种复杂的组合逻辑问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值