处在同一房间中的人,生日相同的概率有多大?
这里是一则小广告:
关注作者请点击这里哦:zdr0
我的专栏里面不仅有学习笔记,也有一些科普文章,相信我的专栏不会让您失望哦~大家可以关注一下:数学及自然科学
记得点赞加收藏哦~
创作不易,请赞赏一下支持一下作者吧[期待]~
文章中如果有错误的话还请各位大佬多多斧正,感谢!
-尽力写最好的讲义,尽力写最好的科普。
好久不写科普啦,今天比较闲,所以写一篇。
假设有随机的 n(n\ge2) 个人处在同一房间中,那么这些人中至少有两个人的生日(不考虑年份)相同的概率是多少?这个问题被称为生日问题(birthday problem)或者生日悖论(birthday paradox)。这个问题还有一种表述方式:在一个房间要有多少人,才能使得其中两个人的生日相同的概率大于 50\% ?答案是 23 个人。直观上来讲,随机的 23 个人当中有两个人生日相同的概率是远小于 50\% 的,由于这种违反直觉的答案,所以这个问题才被称为生日悖论。这里的“悖”并非指的是逻辑上的矛盾,而是有悖于直觉。文章的最后我会解释为何会出现这种有悖于直觉的问题。
在这篇文章中, 我们就来研究一下这个问题。
总注: P(n=\bullet) 代表是的事件“房间中 \bullet 个被随机选中的人中,至少有两个人生日相同”的概率。
首先我们需要来做几个假设,在这些假设的基础上,我们才能来继续研究这个问题。
- 只考虑平年。即一年中有 365 天;
- 不考虑双胞胎或者多胞胎;
- 假设一年中的 365 天的出生概率是相同的。
首先,我们先来定义该问题的样本空间:
\Omega=\left\{1,2,3,\ldots,365\right\}^n\tag{1}
对式 (1) 这样的一个样本空间,我来做以下解释:
- 1,2,3,\ldots,n: 代表了从 1 月 1 日到 12 月 31 日的不同日期(今后若无特殊说明,本文中的日期均记作 \mathrm{m_1m_2.d_1d_2} ,比如 4 月 2 日记作 04.02 )。其中 1 代表 01.01, 365 代表 12.31 ,中间的数字以此类推;
- \left\{\bullet\right\}^n: 这里的 n 不是 n 次方的意思,而是指有 n 个人( n 元组)。
\large{\bm{\rm{Example\quad1:}}}
假设在同一间房子里,有三个随机被选中的人(即 n=3 ),假设这三个人的出生日期分别为: 01.01,\,01.14,\,12.31 ,则我们可以得到一个三元组:
(1,\,14,\,365)\tag{2}
这个三元组就代表了这三个随机被选中的人的生日。
一般来讲,我们会得到一个 n 元组,这个 n 元组的每一个索引代表一个随机被选中的人,这个索引处的值是这个人的生日。
现在我们就要来思考一下了,满足条件结果有多少种可能?我们还是以 n=3 时的情况来说明。在 n=3 时,假设我们得到了一下的三元组:
\rm{(i).}
(34,\,34,\,67)\tag{3}
\rm{(ii).}
(59,\,295,\,59)\tag{4}
(\rm{iii}).
(90,\,45,\,45)\tag{5}
(\rm{iv}).
(67,\,67,\,67)\tag{6}
式 (3) 中,前两个人的生日是相同的,满足条件;式 (4) 中,第一个和第三个人的生日是相同的,亦满足条件;式 (5) 中,最后两个人的生日是相同的,满足条件;最后的 (6) 三个人的生日均是同一天,亦满足条件。这便是在同一个房间中,随机被选中的三个人中至少有两个人生日相同的所有情况了。那么,当房间中的人数增加的时候,通过枚举法来列出所有满足条件的情况显然是不现实的,所以现在的问题是:在一般情况下,我们应该如何计算所有满足条件的情况的总数呢?为了回答这个问题,我们不如再在同一房间中放入另一个随机被选中的人好了,那么现在这个房间中就有 n=4 个人了,现在我们来统计一下所有满足条件的情况有多少种。
\begin{matrix} (1,\,1,\,-,\,-)\\ (1,\,-,\,1,\,-)\\ (1,\,-,\,-,\,1)\\ (-,\,1,\,1,\,-)\\ \vdots \end{matrix}\tag{7}
在式 (7) 中我所举出的这四个四元组中,为了更好的说明问题,我假设了这个房间中的四个随机被选中的人当中的两个都是在 01.01 出生的。现在,我所列出的这四个四元组都是满足条件的情况,即在同一房间中的随机被选中的 n=4 个人当中,至少有两个人的生日是相同的(其中 - 处可以填写 2\sim365 中的任何数字。其实即便是再填 1 也是没有问题的,但是问了说明问题我就不再填 1 了)。当然,这并不是全部满足条件的元组。但是我要说的问题并不是这个,而是我们在统计满足条件的情况总数的过程中,会出现重复的情况,也就是我们会“重数”同一种情况。比如,现在拿出式 (7) 中的其中一种情况进行说明: (1,\,-,\,1,\,-) 。这种情况是已经满足条件的情况了,那么如果剩余的两个人的生日也相同的话就会出现比如:
(1,\,\color{\red}{2},\,1,\,\color{red}{2})\tag{8}
这种情况,当然,这种情况也是满足条件的,因为在这种情况下,至少有两个人(一对。现在有两对)的生日是相同的。但是,如果一开始我的假设是这样的:
(-,\,2,\,-,\,2)\tag{9}
显然,式 (8) 这种情况也是满足条件的情况(即这两个人均出生在 01.02 ),那么现在,如果剩下的两个人的生日均是 01.01 的话那么我们的四元组就变成了:
(\color{red}{1},\,2,\,\color{red}{1},\,2)\tag{10}
我们发现式 (8) 和式 (10) 重复了,这就说明了当房间中的人数比较多的时候,我们在统计满足条件的情况的个数时会出现“重数”的情况。而这种“重数”情况的出现会使我们的概率计算变的非常复杂,所以,我们不采用这种直接计算概率的方法,而是采用计算其互斥事件的概率的方式。
首先,事件“在同一房间中有 n 个随机被选中的人,至少有两个人的生日是同一天”的互斥事件为“在同一房间中有 \bm n 个随机被选中的人,所有人的生日均不同”。我还是以 n=4 的情况举例,假设第一个的生日是 01.01 ,那么第二个人的生日就不能在是 01.01 了,即说明第二个人的生日只能是除了 01.01 以外的剩余的 364 天中的任意一天,比如是 01.02 好了,那么第三个人的生日就必须是在除了 01.01 和 01.02 以外的 363 天中的任意一天,比如是 01.03 好了,那么第四个人的生日就必须是在除了 01.01,\,01.02,\,01.03 以外的 362 天中任意一天了。
也就是说,这四个人中只有一个人的生日可以是在 365 天中任选一天,而剩下的三个人的生日就只能分别在 364,\,363,\,362 天中任选一天了,这样就可以保证这个房间中的四个人的生日均不相同了。所以,总共的选择可能性个数为:
365\cdot 364\cdot 363 \cdot 362\tag{11}
这样的话四个人的生日均不相同的概率为:
\overline{P}(n=4)=\frac{365}{365}\cdot\frac{364}{365}\cdot\frac{363}{365}\cdot\frac{362}{365}\tag{12}\approx0.984
所以,这个房间中的四个人,至少有两个人的生日在同一天的概率为:
P(n=4)=1-\overline{P}(n=4)=1-\frac{365}{365}\cdot\frac{364}{365}\cdot\frac{363}{365}\cdot\frac{362}{365}\approx0.016\tag{13}
可见,当房间中的人太少的时候,很难出现两个生日一样的人。
那么,当房间中有 n 个人的时候,我们可以计算这 n 个人的生日均不相同的概率
注:这里只有当 n\le365 时计算的概率才是有意义的。因为当房间中的人数大于 365 人之时,根据假设,一定会至少有两个人的生日是一样的,那么概率就是 1 了。
{\displaystyle {\begin{aligned}{\overline{P}}(n)&=1\times \left(1-{\frac {1}{365}}\right)\times \left(1-{\frac {2}{365}}\right)\times \cdots \times \left(1-{\frac {n-1}{365}}\right)\\[6pt]&={\frac {365\times 364\times \cdots \times (365-n+1)}{365^{n}}}\\[6pt]&={\frac {365!}{365^{n}(365-n)!}}={\frac {n!\cdot {\binom {365}{n}}}{365^{n}}}\end{aligned}}}\tag{14}
最后,通过 1-\overline{P}(n) 我们就可以计算出这 n 个人中至少有两个人生日相同的概率了。
现在我们就可以来计算一下当房间中有 n=23 个人的时候,至少有两个人生日相同的概率是多大了。我们可以通过以下代码计算 P(n=23) :
public class ProBaCal
{
public static void main(String[] args)
{
System.out.println(1 - proBa(23));
}
public static double factor(int num)//递归计算阶乘
{
if(num==1)
return 1;
else
return num * factor(num-1);
}
public static double binomi(int n, int k)//递归计算二项式系数
{
if((n == k) || (k == 0))
return 1;
else
return binomi(n - 1, k) + binomi(n - 1, k - 1);
}
public static double proBa(int x)//计算互斥事件的概率
{
double pro = (factor(x) * binomi(365, x)) / (Math.pow(365.0, (double)x));
return pro;
}
}
最终计算出的结果是:
P(n=23) \approx 0.507297\tag{14}
可见,当房间中有随机被选中的 23 个人的时候,至少有两个人生日相同的概率高达 50.73\% 。
图片1显示了随着房间中人数的增加,所有人生日均不相同的概率曲线。可见,当 n 越来越接近 365 的时候,所有人生日均不相同的概率越来越低。
下表列出了一些典型值:
\begin{matrix} n &P(n)\\ \hline\\ 1 &0.0\%\\ 5 &2.7\%\\ 10 &11.7\%\\ 20 &41.1\%\\ 23 &50.7\%\\ 30 &70.6\%\\ 40 &89.1\%\\ 50 &97.0\%\\ 60 &99.4\%\\ 70 &99.9\%\\ 75 &99.97\%\\ 100 &99.99997\%\\ 200 &99.9999999999999999999999999998\%\\ 300 &(100 − 6×10^{−80})\%\\ 350 &(100 − 3×10^{−129})\%\\ 365 &(100 − 1.45×10^{−155})\%\\ ≥ 366 &100\% \end{matrix}\tag{15}
如果我们考虑的是闰年,那么 P(n=23)\approx 0.506 。
对于这个概率,这里有一些近似算法。
比如我们可以通过 e^x 的 Taylor 展开式进行近似。我们知道, e^x 的 Taylor 展开式为:
e^{x}=1+x+{\frac {x^{2}}{2!}}+\cdots \tag{16}
而当 |x|<1 时,我们有近似:
e^x\approx 1+x\tag{17 }
当 x=-\frac{a}{365} 时我们有:
e^{-\frac{a}{365}}\approx1-\frac{a}{365},\quad a=1,2,\ldots,n-1,\quad n\le 365\tag{18}
进而我们有:
{\displaystyle {\begin{aligned}{\overline {P}}(n)&=1\times \left(1-{\frac {1}{365}}\right)\times \left(1-{\frac {2}{365}}\right)\times \cdots \times \left(1-{\frac {n-1}{365}}\right)\\ &\overset{(18)}{\approx} 1\times e^{-1/365}\times e^{-2/365}\times\cdots\times e^{-(n-1)/365}\\[6pt]&=e^{-\left.{\big (}1+2+\,\cdots \,+(n-1){\big )}\right/365}\\[6pt]&=e^{-(n(n-1)/2)/365}=e^{-n(n-1)/730} \end{aligned}}}\tag{19}
所以:
P(n)=1-\overline{P}(n)\approx1-e^{-n(n-1)/730}\approx1-e^{-n^2/730}\tag{20}
从图片2中我们可以发现,近似的效果是相当不错的。
另外一种近似方式的思路是这样的:任何两个人不是同一天生日的概率是 364\over365 。现在假设在一个房间中有 n 个人,则有 \binom{n}{2}=\frac{n\cdot (n-1)}{2} 对人,即有 \binom{n}{2} 个事件。没有两个人同一天生日的概率可以通过假设这些事件是独立的从而将它们的概率相乘来近似。简而言之, 364\over365 可以自乘 \binom{n}{2} 次,得到:
{\displaystyle {\overline {P}}(n)\approx \left({\frac {364}{365}}\right)^{\binom {n}{2}}}\tag{21}
因为这是没有人同一天生日的概率,那么某两人同一天生日的概率就是:
{\displaystyle P(n)=1-\overline{P}(n)\approx 1-\left({\frac {364}{365}}\right)^{\binom {n}{2}}}\tag{22}
我们还可以使用 Poisson 近似。我们将二项式的泊松近似应用于 23 个人:
{\displaystyle \operatorname {Poi} \left({\frac {\binom {23}{2}}{365}}\right)=\operatorname {Poi} \left({\frac {253}{365}}\right)\approx \operatorname {Poi} (0.6932)} \tag{23}
所以:
\Pr(X>0)=1-\Pr(X=0)\approx 1-e^{-0.6932}\approx 1-0.499998=0.500002. \tag{24}
结果与前面的描述一样,大于 50\% 。
下面我们再来确定一下概率的上界和人数的下界。下面的论证改编自 Paul\,\,Halmos 的一个论证。
如上所述,没有两个人生日一样的概率是:
{\displaystyle 1-P(n)={\overline {P}}(n)=\prod _{k=1}^{n-1}\left(1-{\frac {k}{365}}\right)}\tag{25}
因此关注第一个 n ,欲使乘积小于 1\over2 。由均值不等式可得:
\sqrt[n-1]{\prod_{k=1}^{n-1}\left(1-{k \over 365}\right)} <{1 \over n-1}\sum_{k=1}^{n-1}\left(1-{k \over 365}\right) \tag{26}
再利用 1 到 (n-1) 所有整数和等于 n\cdot(n-1)\over2 ,然后利用不等式 1-x < e^{-x} ,可以得到:
\begin{align} &\prod_{k=1}^{n-1}\left(1-{k \over 365}\right) <\left({1 \over n-1}\sum_{k=1}^{n-1}\left(1-{k \over 365}\right)\right)^{n-1}\\ &{\displaystyle =\left(1-{n \over 730}\right)^{n-1}<\left(e^{-n/730}\right)^{n-1}=e^{-(n^{2}-n)/730}} \\ &<\frac{1}{2}\Rightarrow n^2-n>730\cdot\ln2\approx 506\\ &\Rightarrow n\approx 23 \end{align}\tag{27}
Halmos 的推导只表明至少超过23人就能保证平等机会下的生日匹配。因为不知道给出的不等式有多严格,因此从这个计算过程中无法确定当 n=22 时是否就能让概率超过 0.5 。
现在,我们将这个生日问题泛化。
给定有 d 天的一年,广义生日问题要求最小数字 n(d) ,这样,在一组随机选择的 n 个人中,生日匹配的概率至少为 50\% 。换句话说, n(d) 是这样的最小整数:
1-\left(1-{\frac {1}{d}}\right)\left(1-{\frac {2}{d}}\right)\cdots \left(1-{\frac {n-1}{d}}\right)\geq {\frac {1}{2}} \tag{28}
因此,之前我们所讨论的生日问题中的一年中的天数为 365 天,对应于确定 n(365) 。这里给出了 n(d) 的前 99 个值:
\begin{matrix} d &1\sim2 &3\sim5 &6\sim9 &10\sim16 &17\sim23 &24\sim32 &33\sim42 &43\sim54 &55\sim68 &69\sim82 &83\sim99\\ \hline\\ n(d) &2 &3 &4 &5 &6 &7 &8 &9 &10 &11 &12 \end{matrix}\tag{29}
类似的计算表明,当 d 在 341\sim372 范围内时, n(d) = 23 。
生日问题还可以泛化为以下问题:
给定从符合离散均匀分布的区间 [1,d] 随机取出 n 个整数,至少 2 个数字相同的概率 P(n;d) 有多大?
类似的结果可以根据上面的推导得出:
{\displaystyle {\begin{aligned}p(n;d)&={\begin{cases}1-\displaystyle \prod _{k=1}^{n-1}\left(1-{\frac {k}{d}}\right)&n\leq d\\1&n>d\end{cases}}\\[8px]&\approx 1-e^{-{\frac {n(n-1)}{2d}}}\\&\approx 1-\left({\frac {d-1}{d}}\right)^{\frac {n(n-1)}{2}}\end{aligned}}} \tag{30}
相反,如果 n(p;d) 表示从 [1,d] 中抽取的随机整数个数,得到至少两个数相同的概率 p ,则:
{\displaystyle n(p;d)\approx {\sqrt {2d\cdot \ln \left({\frac {1}{1-p}}\right)}}.} \tag{31}
在生日问题中,两个人都不是提前选定的。但是现在,我们考虑一下,在一个房间里其他的 n 个人中有另外一个人与你同一天生日的概率 Q(n) 是多大?这个概率当然也不难计算,我们仍然采取计算互斥事件的方法。如果剩下的 n 个人都与你的生日不同,那么他们的生日就可以是除了你的生日以外的剩下的 364 天中的任何一天,然而他们之间是否有人生日匹配我们并不关心,所以,互斥事件的概率是 \left(\frac{365-1}{365}\right)^{n} ,所以,我们要求的概率是:
Q(n)=1-\left(\frac{365-1}{365}\right)^n\tag{32}
这个问题泛化的结果是:
Q(n;d)=1-\left(\frac{d-1}{d}\right)^n\tag{33}
在 d = 365 的标准情况下,代入 n = 23 约为 6.1\% 。如果一屋子 n 个人中有一个人的生日和你的生日相同的概率超过 50\% , n 的值至少是 253 。这个数字明显高于 {365\over 2} = 182.5 ,原因是房间里的其他人可能有一些生日匹配。
图片3显示的是之前的生日问题的概率 P(n) 与我们刚刚计算出的一屋子 n 个人中有一个人的生日和你的生日相同的概率 Q(n) 之间的比较。这里就可以解释为什么大多数人之所以会认为 23 人中有 2 人生日相同的概率应该远远小于 50\% ,是因为它们将问题理解为“其他 22 人与他们自己的生日相同的概率”,而非问题本意“ 23 人之中两两之间存在生日相同”。