从排列与组合的python实现到”生日问题”的解释

首先定义我们的记号(notation),用整数 i=1,2,,k  来对房间里的人进行编号,其中 k 是房间里的总人数。不考虑闰年,所有的年份都是 n=365 ,令 b i  表示第 i 个人的生日。我们假设每个人的生日是独立的(这是一个重要假设),则 i j  生日落在同一天 r  的概率为:

Pr{b i =r,b j =r}=Pr{b i =r}Pr{b j =r}=1n 2   

他们的生日落在同一天的概率为:

 r=1 n Pr{b i =r,b j =r}= r=1 n Pr{b i =r}Pr{b j =r}=n1n 2  =1n  

所以这有一个结论,如果两个人生日彼此独立的话,一个人生日在某一天的概率为 1n  ,两个人生日在同一天的概率也为 1n  

再来看,至少两人生日在同一天的概率:

1A k n n k  === 1n!(nk)! n k  1n(n1)(nk+1)n k  11n1n n2n nk+1n   

又由 e x  的泰勒展开为:

e x = n=0  x n n! =1+x+x 2 2 + 

也即



1+xe x  

所以如果要求至少有两人生日在同一天的概率 1 ,也即 1A k n n k  12  ,也即:

1n1n n2n nk+1n 12  

又由于

1+xe x  ,所以,



1n1n n2n nk+1n e 1/n e 2/n e (k1)/n =e k(k1)/2n 1/2 

求解得

k(1+1+(8ln2)n − − − − − − − − − −   )/2 ,当

n=365 时,必须有

k23 

>>> from math import sqrt, log
>>> (1+sqrt(1+8*log(2)*365))/222.99994315123396

也即,如果至少有23个人主宰一个房间里,那么至少有两人生日相同的概率至少为1/2 

在火星上,一年有669个火星日,也即 n=669 

>>> (1+sqrt(1+8*log(2)*669))/2
30.957854940707936

则在火星上要达到同样的效果,必须有31个火星人。

利用指示器随机变量进行近似分析

利用指示器随机变量(Indicator Random Variable),可以给生日悖论一个简单而近似的分析。对房间中 k 个人中的每一对 (i,j) 1i<jk ,定义指示器随机变量 X ij  如下:

X ij =1 i,j ={1,0, i,j  

又知两个人生日在同一天的概率为

1/n ,所以有:



E[X ij ]=Pr{i,j}=1n  



X 表示计数具有相同生日的两人对出现的数目的随机变量:
X= i=1 k  j=i+1 k X ij  

对两边取期望并应用
期望的线性性质,得到:



E(X)= i=1 k  j=i+1 k E(X ij )=(k2)1n  

因此当 k(k1)2n 时,有相同数目的两人对的期望数目大于1。当 n=365 时,k=28