深入浅出统计学 第六章 排列与组合
内容简介
本章内容主要介绍了两个基本概念,排序与组合
其中组合是之后计算二项分布的预备知识
对于计算而言,重点在于理解其所适应的不同情况,并记忆公式.
两者区别(P261):
1. 排列与顺序有关
2. 组合与顺序无关
或许理解其使用的不同情况还有一些困难,
但是仅仅对于编程而言,本章内容可以说出奇的简单,我们只需要编写阶乘公式,然后组合一下就可以了
编码
思路
从公式上看,组合公式不过比排列公式多了一个阶乘作为分母,而其构成则不过都是阶乘公式而已.
因此我们先编写阶乘公式,然后进行公式拼接即可.
这里我们给出最常用的两种阶乘公式的实现方式,在数值较小时,两者速度差异可以忽略.
两种阶乘公式的实现
import numpy as np
def Factorial_Recursion(n):
if n==1 & n==0:
return 1
else:
return n*Factorial_Recursion(n-1)
def Factorial_Loop(n):
if n==1 & n==0:
return 1
else:
result = n;
for i in range(2,n):
result *= i
return result
print("5的阶乘 {0}".format(Factorial_Loop(5)))
print("5的阶乘 {0}".format(Factorial_Recursion(5)))
5的阶乘 120
5的阶乘 120
实现排列与组合
为了复用代码,我们这里将组合与排列合并,并将组合视为排列的一种部分元素无顺序的特殊性情况.
然后我们利用编写的函数计算文中258页到260页的问题:
1. 20匹马的冠亚季军编号
2. 20匹马的前三名编号(无视先后顺序)
# 排列 permutation
# 组合 combination
def Permutation(n,r,IsCombination=False):
if IsCombination:
return Factorial_Loop(n)/Factorial_Loop(n-r)/Factorial_Loop(r)
else:
return Factorial_Loop(n)/Factorial_Loop(n-r)
print("冠亚季军编号一共有{0}种情况,但是无视前后顺序的话,则有{1}种情况".format(Permutation(20,3),Permutation(20,3,IsCombination=True)))
冠亚季军编号一共有6840.0种情况,但是无视前后顺序的话,则有1140.0种情况