用計算機解決生日悖論
至於怎麼來的,樓主就不多說了,學過概率論的都懂。
作為一個愛動手的樓,樓樓畫出了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)複數的史前史
※【不等式】丟掉次數:伯努利不等式及其應用
※從外微分到微分幾何(一)
※【解析幾何】雙聯立(齊次化處理)解決定點問題