演算法問題 生日悖論

2022-07-12 16:30:30 字數 1755 閱讀 1090

問題:

乙個屋子裡人數必須要達到多少人,才能使其中兩人生日相同的機會達到50%?

為了回答這個問題,設:

1、設k是屋子裡的總人數,對每乙個人進行編號,則編號為1,2,3···k

2、設所有年份都是365天,最大天數n=365

3、bi表示第i個人的生日天數,所以1<=bi<=360,1<=i<=k

public

class

main = 1/n

*//**

* 第i個人和第j個人的生日,「都落在第r天的概率」為:

** p = p*p = (1/n)^2

*//**

* 第i個人和第j個人的生日,「都落在同一天的概率」為?

* 此處的落在同一天並沒有指定落在那一天,所以可以都是第1天或者都是第二天或者·····

** p

* = p*p + p*p+···+p*p

* = (1/n)^2 + (1/n)^2 + ···+ (1/n)^2

* = 1/n

*//**

* 原問題是:找到「至少有兩個人生日相等」

* 換句話說就是:1減去所有人生日都互不相同的概率。

* 所以接下來就要找到「所有人生日都互不相同的概率」

** 設:

* 1、有k個人,這k個人生日都互不相同的事件為:bk

* 2、那麼k個人生日都互不相同的事件的概率就為:p

* 3、有乙個人i,有多個人1-j,其中j*/

/***

* 由原題「生日相同的機會達到50%」,

* 所以:1-p >=50%,即:p <= 1/2

** 下面就是使用一些數學知識求解了:

* 根據不等式:1+x<=e^x ,將「-((k-1)/n)」看成不等式中的x,得:

* p <= e^(-(1/n)) *···* e^(-((k-1)/n))

* p <= e^((-k*(k-1))/2n)

* e^((-k*(k-1))/2n) <= 1/2 (原題目要求)

** 將n=365時,

* 解得:k>=23

* 所以,乙個屋子裡人數必須要達到23人,才能使其中兩人生日相同的機會達到50%

*/public

static

void

main(string arg)

/*** 當一年有sum_day天時,

* 乙個屋子裡人數必須要達到多少人,才能使其中兩人生日相同的機會達到50%

* @param

sum_day 一年的總天數

* @return

至少得有多少人,才能達到要求

*/public

static

int birth_paradox(double

sum_day)=1

double pb = 1;

/*** 從第sum_people=1個人開始找起,看其兩兩生日不等時,事件概率是否成立。

* 如果不成立,則sum_people+1。

*/for (sum_people = 1;sum_people<=sum_day+1;sum_people++)

double pa = ((sum_day)-sum_people+1)/sum_day;

//p = p * p

pb = pb*pa;

//如果1-p >=50%

if ((1-pb)>= 0.5)

}return

sum_people;

}}

生日悖論問題 《演算法導論學習筆記》

乙個房間裡的人數必須達到多少,才能使兩個人生日相同的機會達到 50 不考慮閏年情況,也就是一年按照 365天來計算。解答 假設房間裡的人數是 k,我們對其進行編號 1,2,k 為簡單起見,用 n表示一年的天數 也就是 365天 那麼乙個人的生日在一年中的哪一天應該是機會均等的,我們用 bi表示第 i...

python中生日悖論分析 從生日悖論談雜湊碰撞

1 前言 前幾天和乙個大佬交流了幾個問題,其中乙個關於id生成的問題推展到了雜湊衝突和乙個與之相關的乙個數學趣題生日悖論。雜湊的對映壓縮和衝突 生日悖論 crc32的衝突分析 2.雜湊對映壓縮和衝突 雜湊的本質就是數學,簡單來說雜湊函式實現了各種長度和形式的輸入經過公開的雜湊函式的運算生成乙個固定長...

什麼是生日悖論?

生日悖論 生日悖論是指在不少於 23 個人中至少有兩人生日相同的概率大於 50 例如在乙個 30 人的小學班級中,存在兩人生日相同的概率為 70 對於 60 人的大班,這種概率要大於 99 從引起邏輯矛盾的角度來說,生日悖論並不是一種 悖論 但這個數學事實十分反直覺,故稱之為乙個悖論。生日悖論的數學...