深入浅出统计学 第六章 排列与组合

内容简介

本章内容主要介绍了两个基本概念,排序与组合
其中组合是之后计算二项分布的预备知识
对于计算而言,重点在于理解其所适应的不同情况,并记忆公式.
两者区别(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种情况
posted @ 2018-07-02 21:21  FontTian  阅读(431)  评论(0编辑  收藏  举报