用計算機解決生日悖論

生日悖論是一個概率學上的經典問題,也是一個討論廣泛的問題,前人們已經用數學方法計算過無數次了,既然這樣,樓主為什麼又要舊事重提呢?因為作為一個計院的人,樓主今天要用電腦來算算生日悖論了??*( ?o? )*°゜?°

首先,什麼是生日悖論?舉個簡單例子,如果一個班級里有23個人,那麼至少有兩個人的生日相同的概率要大於50% 如果這個班有63人,那麼這個班至少有兩個人生日相同的概率高達99% 。結果是通過數學計算得來的,看起來與直覺相左,因此被稱為生日悖論。

在n個人中,至上存在兩個人生日相同的概率p為:

p=1-frac{365}{365} ullet frac{364}{365}  ulletfrac{363}{365}  ullet...ulletfrac{365-n+1}{365}

至於怎麼來的,樓主就不多說了,學過概率論的都懂。

作為一個愛動手的樓,樓樓畫出了p關於n的函數圖像:

n = 23 時;p = 0.507297234323986;

n = 57 時;p = 0.990122459341170 。

以上就是用數學方法算的結果。

。。。。。。。。。。廢話是不是多了點。。。。。。。。分割線。。。。。。。。。。。。

下面是正文了,既然是悖論,樓主也懷疑結果的正確性,所以編了個小程序算了下,用的是MATLAB,總共模擬實驗了1000000次,看看結果怎樣。

alltimes = 1000000; %模擬實驗次數wintimes = 0; %實驗成功 即存在兩個人生日相同的次數birthday = zeros(alltimes, 23); %產生一個1000000x23的矩陣,用以存儲生日for k=1:alltimes for i=1:23 birthday(k,i) = ceil(rand()*365); %產生一個1-365的隨機整數,用以模擬生日 end flag = 0; %flag用以判斷本次實驗中是否存在兩個人生日相同,不存在為0, for i=1:22 %開始查找是否有兩個人生日相同 for j=i+1 :23 if birthday(k,i) == birthday(k,j) flag =1; %找到了一對生日相同的人,flag改為1. end %結束if end end %結束查找 if flag ==1 wintimes = wintimes+1; %flag 為1則試驗成功次數加1. end end %結束實驗p_2samein23 = wintimes/alltimes %p的值即為23個人中至少存在兩個人生日相同的實驗概率

運行結果是 50.83%

與數學方法計算的0.5073相似= = 好吧,我大gay率學家們算的果然沒錯。但是樓主會就此止步嗎?經過一番折騰,樓主把人數改成了57人,又運行了一遍,結果是99.02%,++ 又和數學計算結果相近 = = 樓主放棄推翻生日悖論一炮走紅的機會了,代碼附上,給各位玩去。

alltimes = 1000000; %模擬實驗次數wintimes = 0; %實驗成功 即存在兩個人生日相同的次數number = 57; %代表一次模擬的總人數birthday = zeros(alltimes, number);for k=1:alltimes for i=1:numberbirthday(k,i) = ceil(rand()*365); %產生一個1-365的隨機整數,用以模擬生日endflag = 0; %flag用以判斷本次實驗中是否存在兩個人生日相同,不存在為0,for i=1:number-1 %開始查找是否有兩個人生日相同for j=i+1 :numberif birthday(k,i) == birthday(k,j)flag =1; %找到了一對生日相同的人,flag改為1.end %結束ifendend %結束查找if flag ==1wintimes = wintimes+1; %flag 為1則試驗成功次數加1.end end %結束實驗p_2same = wintimes/alltimes

修改第一行 alltimes的值可以改變模擬次數,修改第三行number的值(即問題中的n)可以改變模擬的人數,如 alltimes = 1000; number = 20;則實驗結果表示,模擬1000次,在20個人中至少存在兩個人生日相同的概率。

=============版權所有===========

第一次寫文章,求贊- 。-

推薦閱讀:

隨筆一則
復幾何的故事(1)複數的史前史
【不等式】丟掉次數:伯努利不等式及其應用
從外微分到微分幾何(一)
【解析幾何】雙聯立(齊次化處理)解決定點問題

TAG:MATLAB | 概率論 | 數學 |