1.排列&組合
-
有n個(gè)小球從中抽取m個(gè),問(wèn)有序抽取并且有重復(fù)的抽取個(gè)數(shù)為多少?
-
有n個(gè)小球從中抽取m個(gè),問(wèn)有序抽取并且無(wú)重復(fù)的抽取個(gè)數(shù)為多少?
排列:
-
有n個(gè)小球從中抽取m個(gè),問(wèn)無(wú)序抽取并且無(wú)重復(fù)的抽取個(gè)數(shù)為多少?
組合:
-
有n個(gè)小球從中抽取m個(gè),問(wèn)無(wú)序抽取并且有重復(fù)的抽取個(gè)數(shù)為多少?
以上四種情況均為最常見(jiàn)的排列組合,從有無(wú)順序和是否重復(fù)兩個(gè)維度進(jìn)行思考,建議理解并背誦。
2.使用Python表示排列組合
在使用python計(jì)算排列組合之前,需要計(jì)算階乘,可以有兩種方式,一是使用math庫(kù)中的factorial函數(shù),二是使用如下的遞歸函數(shù)。
def factorial(n):
"""
計(jì)算階乘
:param n: data
:return:
"""
if n == 1:
return 1
else:
return n * factorial(n-1)
按照排列的公式:
def my_permutation(n, k):
"""
計(jì)算無(wú)重復(fù)有序的排列數(shù)
:param n: 樣本
:param k: 抽取
:return: 排列數(shù)
"""
return factorial(n)//factorial(n-k)
按照組合的公式:
def my_combination(n, k):
"""
計(jì)算無(wú)序且不重復(fù)的組合數(shù)
:param n: 樣本
:param k: 抽取
:return: 組合數(shù)
"""
return factorial(n)//(factorial(n-k)*factorial(k))
3.例題
3.1 生日問(wèn)題
假設(shè)一個(gè)班級(jí)中共有n個(gè)人,一年有365天,其中每天作為生日的概率是相等的,那么其中至少有兩個(gè)人的生日在同一天的概率是多少?
此題屬于全排列問(wèn)題,需要反向思考,寫(xiě)出公式之后直接輸入到python中計(jì)算
def birth(n):
"""
計(jì)算至少有兩人的生日在同一天的概率
:param n: 班級(jí)人數(shù)
:return: 概率
"""
return 1 - factorial(365)/(factorial(365-n)*365**n)
# prob = birth(50)
# print("{:.2f}%".format(prob*100))
3.2 大樂(lè)透問(wèn)題
大樂(lè)透的玩法是這樣的,從35個(gè)紅球中選擇5個(gè),從12個(gè)紅球中選擇2個(gè),如果全中,那就中一等獎(jiǎng)。那么請(qǐng)問(wèn),中一等獎(jiǎng)的概率是多少?
此題屬于組合問(wèn)題,中獎(jiǎng)的可能性為一種,因此分子為1,分母為所有的組合情況。
def prize():
return 1/(my_combination(35, 12) * my_combination(12, 2))
prob = prize()
print("{:.15f}%".format(prob%100))