本周的Riddler经典共享生日是一个具有挑战性的计算问题。
假设人们走进一个房间,一次一个。他们的生日碰巧在一年365天中随机分布(没有人出生在闰日)。当房间里的两个人过同一个生日时,再也没有人进入房间了,屋里的每个人都吃蛋糕庆祝,不管这个共同的生日是不是今天。
平均来说,当他们吃蛋糕时,房间里的预期人数是多少?
额外学分:假设房间里有三个人生日相同,每个人都吃蛋糕。平均而言,预计人数是多少?
我的解决方案:
[显示解决方案]
假设一年中有$n$天,那么$n$可能的生日不同。如果房间里有$k$人吃蛋糕,那么这意味着第一个$k-1$人的生日不同,而这个$k^\text{th}$人的出生日期与第一个$k-1$生日中的一个生日相匹配。发生这种情况的方式有:
\[
\下大括号{n(n-1)(n-2)\cdots(n-k+2)}{k-1\text{terms}}\cdot(k-1)
=\压裂{n!(k-1)}{(n-k+1)!}
\]请注意,我们必须有$1\leq-k\leq-n+1$,因为如果$k$大于$n+1$,那么第一个$k-1$的人就不能有不同的生日,并且上面的乘积为零。同时,生日组合的总数为$n^k$。因此,当他们吃蛋糕时,房间里的预期人数由以下公式给出:
$\显示样式
E_2=\sum_{k=1}^{n+1}\frac{n!\cdot k(k-1)}{(n-k+1)!\cdot n^k}
$
不幸的是,这个和并没有封闭的解,但我们可以用数字来计算。当$n=365$时,我们发现房间内的预期人数为$24.61659$。
这个特别的金额是Ramanujan研究,他发现总和有一个渐近展开式(作为$n$的函数),其增长如下
\[
\求和{k=1}^{n+1}\分数{n!\cdotk(k-1)}{(n-k+1)!\cdot n^k}
\近似\sqrt{\frac{\pin}{2}}+\frac{2}{3}+\frac{1}{12}\sqrt{\frac{\pi}{2n}}+\cdots
\]这个近似值相当好。事实上,当$n=365$时,我们有:
\[
\sqrt{\frac{\pin}{2}}+\frac{2}{3}=24.6112
\quad\text{和}\quad
\sqrt{\frac{\pin}{2}}+\frac{2}{3}+\frac{1}{12}\sqrt{\frac{\pi}{2n}}=24.6167
\]都接近真实值。
额外学分
当我们寻找3个匹配的生日时,计算过程变得复杂得多。假设在$k^\text{th}$人进入房间之前有$\ell$对匹配的生日。为了计算发生这种情况的方式,我们有:
- $\binom{n}{\ell}$选择一年中有成对生日的$\ell$天的方法。
- $\binom{k-1}{2\ell}$选择生日配对的$2\ell$人的方法。
- $\binom{2\ell}{\下大括号{2,\dots,2}_{\ell\text{times}}=\frac{(2\ell)!}{2^\ell}$将$\ell$对生日分配给$2\ell$人的方法。
- $\underbrace{(n-\ell)(n-\ell-1)\cdots(n+\ell-k+2)}_{k-1-2\ell\text{terms}}=\frac{(n-\ell,)!}{(n+\ ell-k+1)!}$为第一个$k-1$人的其他人指定独特生日的方法。
- $\ell$方法使$k^\text{th}$人匹配其中一个$\ell$s对。
就总和范围而言,我们必须有$1\leq\ell\leq\frac{k-1}{2}$,因为在第一个$k-1$人中必须至少有一对匹配的人,而$2\ell\leq k-1$则是因为这些配对的生日不能超过总人数。因此,当有3个匹配的生日时,房间内的预期人数为:
\[
E_3=\sum_{k=1}^{n+1}\sum_{\ell=1}^{\left \lfloor\frac{k-1}{2}\right \lfloor}
\二进制{n}{\ell}
\二进制{k-1}{2\ell}
\压裂{k\ell\cdot(n-\ell)!(2\ell)
\]只要稍加努力,我们就可以展开二项式并简化一些阶乘项,我们得到
$\显示样式
E_3=\sum_{k=1}^{n+1}\sum_{\ell=1}^{\left \lfloor\frac{k-1}{2}\right \lfloor}
\压裂{n!\,k!}{(\ell-1)!\,(k-1-2\ell)!\、(n+\ell-k+1)!\cdot 2^\elln^k}
$
正如您所料,此表达式也没有闭合形式,但我们可以再次对其进行数值计算,当$n=365$时,我们得到$88.7389$。
数值验证
我写了一个简单的Python脚本来模拟游戏,看看我们是否能证实上面的发现。
从随机导入randint从操作员导入countOf将numpy导入为npN=100000#试验次数n=365#天数m=2#当有m个重复的生日时,我们庆祝长度=[]对于范围(N)内的试验:x=[]对于范围(1,n+2)中的k:z=随机数(1,n)如果countOf(x,z)==m-1:长度.附加(k)打破其他:x.附加(z)a=np.mean(长度)#经验平均值sem=np.std(长度)/np.sqrt(N)#标准错误打印(f'预计人数为{a}±{1.96*sem:.3f}(95%置信度)')
在$m=2$的情况下运行上述程序,我获得了$24.55923±0.075$。
在$m=3$的情况下运行上述程序,我获得了$88.69134±0.204$。正负表示95%的置信区间。两种模拟均与上述解析表达式一致。