在 數論及Python實踐一文中,我們介紹了組合的基本定義以及一些常規實現方法,并未充分發揮python語言的優勢,本文我們從reduce
函數的角度(從這個角度我們應當恢復reduce
正宮娘娘的地位,因為在python3中Guido將reduce
從系統內置函數降格為functools
中的函數),重新實現給出排列組合的各自實現,以及據此給出”生日問題”的概率解釋。
排列組合python?
2?n?? 這不正是二進制嘛!這個結論有什么用?舉個栗子,給定三個卡片,編號為 1?3?,使用該等式可得其會有 2?3?=8?種組合(combinations或叫subsets)(包括空集):
再來考慮這樣一種情形,從 n?個數中隨機選擇
再來看幾個結論:
python中排序、
左邊允許重復,右邊不允許重復;
當我們試圖用reduce
實現組合數的計算時,
python生日,
from functools import reduce
import operatordef fac(n):return reduce(operator.mul, range(1, n+1), 1)# 階乘n!的定義# reduce與operator.mul結合
def perm(n, k):return reduce(operator.mul, range(n-k+1, n+1), 1) # 排列數的定義
def comb(n, k):return perm(n, k)//fac(k) def test():print('{}!={}'.format(5, fac(5)))print('A_{}^{}={}'.format(5, 2, perm(5, 2)))print('C_{}^{}={}'.format(5, 2, comb(5, 2)))
if __name__ == '__main__':test()
運行結果為:
5!=120
A_5^2=20
C_5^2=10
由以上準備,我們可求解概率論史上的經典問題(概率論史上的經典問題一般是指違反直覺的那些問題)”生日問題”:
一次聚會上,只要有23個人,就有50%的可能性其中至少有兩個人生日相同,如果人數達到50人,至少有兩個人生日相同的概率達到97%。(這個結論很恐怖,只要是班上的人數超過50,老師便可以說,我們班至少有兩個人生日相同,其實在人數超過23的時候,我們便可以這么說,應為概率占優,注意,是班上會有來個人生日相同,不是說,班上至少存在一個人生日生日與我相同)。
當然這類問題從其反問題對立事件出發,1?P(所有人都不在同一天)=P(至少有兩人在同一天)?,
python 3。
這里的A?50?365??可以理解為,隨意指定一個生日,他生日所在的自由度
(或者作可選空間)為365,則下一個人只有365-1的自由度
,依次類推。365?50??是考慮到這50個人的生日大體獨立,也即每一個的生日都有365個自由度
(也即365種選擇)。所謂概率,頻率的觀點(另有貝葉斯的觀點)來看就是出現的次數與總的可能性之比。
>>> 1-perm(365, 23)/(365**23)
0.5072972343239854
>>> 1-perm(365, 50)/(365**50)
0.9703735795779884
注意:如果預先指定一個生日,隨機選取125人,250人,500人,出現某人生日正好是這一生日的概率分別是:
python生日祝福,比想象的要小很多,再次說明概率中的許多問題都比較違反直覺。
補充:
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态