翻數學書偶然看到的。
假設你所在的班級共有30人,那麼你們班「至少有兩個人生日相同」的概率是多少?
因為每個人的生日有可能是365天中的任意一天,這樣一來,只有人數超過365時,我們才能百分之百地肯定至少有兩個人的生日相同。因此,感覺上,前述問題的概率應該不會很大。不過,令人驚訝的是,「至少有兩個人生日相同」的概率約為70%!
事實上,當人數達到23時,至少有兩個人生日相同的概率就超過50%了!而當人數達到41人時,概率就超過90%了! 這一結論與人們的直覺相差比較遠,因此常被稱為 生日悖論
以上,來自數學書。
問題分析一開始我對這個問題沒什麼頭緒(拜託,排列組合就看了三分鐘),大概的感覺是,由於並不是要求某個 確定的日期 ,其概率可能會產生某種疊加。
很模糊的想法。
我就想著直接拿計算機,通過隨機的方式模擬一下(蒙特卡洛方法來著?),整理規律之後再分析。不會太難。不過想了想,最後還是沒有做。
我還是決定按照普通的方式,由簡入深。23個人的情況太複雜,我要對這個問題進行 適當的後退 ,把它變成一個方便研究的問題。
後退首先,365天太多了,我們就把它看成是360天吧。其實後退成12個月也是沒什麼問題,不過我覺得退到360就好了。
其次,23個人太多,我們要從人比較少開始想起。就從0個人開始吧
0個人。沒啥說的,「至少有兩個人生日相同」(下面簡稱 重複)的概率,妥妥的0
1個人,也沒法重複,概率是0
2個人。第一個人隨便佔據一天,第二個人要 恰好跟第一個人佔據同一天 也就是選中360天中的特定1天,機率就是
23個人。第二個人和第一個人相同的概率就是2個人時的概率
還是圖片有點意思。想這種東西對著一張草稿紙筆畫就好。
3之後的第四個,就是在第三個也不中的情況下中前面三個的。圖解就是——
4表達式是:
寫到這裡我有點惱火了。規律非常明顯,但是這個表達式我死活不知道要怎麼化簡成一個更好看的式子。
直到——
轉化我發現探究 不重複 的機率比探究 重複 的機率要方便的多。
1的時候,絕對不重複,不重複的機率是1,2的時候,不重複的機率是
3的時候,不重複 就是 在2跟1不相同的基礎上,3既不跟1相同也不跟2相同 ,也就是
圖片解釋4個都不重複就是
五個
這個要找規律就要方便的多了。隨著人數的增加,這個 不重複 的概率就會減小,快速的減小。對應的,重複 的概率就會增加。
其實,上面這些式子可以用階乘 的方式得到通用計算式,不過我學的還不太好,就不整了
問題計算交給電腦。
看到上面那些式子的時候,有些朋友可能會一眼看出:這不就是遞歸嘛。n個人「不中」的概率,就是「n-1」人「不中」的概率再乘上一個數
所以說,代碼是十分簡潔的。
# 語言 python
# 計算所有人生日都不一樣的概率
def calc(n):
if not n==0:
return calc(n-1)*((365-n)/365)
else:
return 1//C 好久沒寫了,可能是錯的。
float calc(int n){
if (n>0){
return calc(n-1)*((365-n)/365.0);}
else{
return 1.0;}
}我們分別計算0~100個人組成的人群中 重複 的概率,繪製成一個折線圖。完整代碼——
# 圖表的庫
from pyecharts import Line
# 計算所有人生日都不一樣的概率
def calc(n):
if not n==0:
return calc(n-1)*((365-n)/365)
else:
return 1
num = [i for i in range(1,101,1)]#這裡是人數
res = [calc(i) for i in num]#儲存
# 展示圖表的
L = Line("生日悖論")
L.add("全都不一樣",num,res,
xaxis_name="人群人數",
yaxis_name="概率",
is_symbol_show=0,
is_smooth=True,
is_datazoom_show=True,
datazoom_range=[0,70],
is_toolbox_show=False
)
L.render()結果非常的amazing啊,....
折線可以看到,在23那個位置,全都不一樣的概率已經降至50%一下, 說明這時至少兩人生日相同的可能性已經超過了50%! 而到41的時候,概率已經降至10%一下, 也就是至少兩人生日相同的概率超過90%了。
和問題介紹中的情況一樣。
另外,對這張圖感興趣的朋友,我會把下載連結放在閱讀原文中。下載後解壓,這是一個html文檔,在瀏覽器裡打開。我還為你準備了一個滑動條,方便你隨意觀察。
- END -