生日悖论问题

article/2025/8/27 23:45:19

生日悖论是指,如果一个房间裡有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。这就意味着在一个典型的标准小学班级(30人)中,存在两人生日相同的可能性更高。对于60或者更多的人,这种概率要大于99%。从引起逻辑矛盾的角度来说生日悖论并不是一种悖论,从这个数学事实与一般直觉相抵触的意义上,它才称得上是一个悖论。大多数人会认为,23人中有2人生日相同的概率应该远远小于50%。计算与此相关的概率被称为生日问题, 在这个问题之后的数学理论已被用于设计著名的密码攻击方法:生日攻击

对此悖论的解释

理解生日悖论的关键在于领会相同生日的搭配可以是相当多的。如在前面所提到的例子,23个人可以产生C(23,2)= 23 × 22/2 = 253 种不同的搭配,而这每一种搭配都有成功相等的可能。从这样的角度看,在253种搭配中产生一对成功的配对也并不是那样的不可思议。

换一个角度,如果你进入了一个有着22个人的房间,房间裡的人中会和你有相同生日的概率便不是50:50了,而是变得非常低。原因是这时候只能产生22种不同的搭配。生日问题实际上是在问任何23个人中会有两人生日相同的概率是多少。

概率估计

假設有 n 個人在同一房間內,如果要計算有兩個人在同一日出生的機率,在不考慮特殊因素的前提下,例如閏年、雙胞胎,假設一年365日出生概率是平均分佈的(現實生活中,出生機率不是平均分佈的)。

計算機率的方法是,首先找出p(n)表示 n 個人中,每個人的生日日期都不同的概率。假如n > 365,根據鴿巢原理其概率為0,假设 n ≤ 365,则概率为

/bar p(n) = 1 /cdot /left(1-/frac{1}{365}/right) /cdot /left(1-/frac{2}{365}/right)  /cdots /left(1-/frac{n-1}{365}/right) =/frac{364}{365} /cdot /frac{363}{365} /cdot /frac{362}{365} /cdots /frac{365-n+1}{365}
该图片显示特定人数对应的2个人生日一样的概率

因为第二个人不能跟第一个人有相同的生日(概率是364/365), 第三个人不能跟前两个人生日相同(概率为363/365),依此类推。用阶乘可以写成如下形式

{ 365! /over 365^n (365-n)! }

p(n)表示 n个人中至少2人生日相同的概率

 p(n) = 1 - /bar p(n)=1 - { 365! /over 365^n (365-n)! }

n≤365,根据鸽巢原理, n大于365时概率为1。

n=23发生的概率大约是0.507。其他数字的概率用上面的算法可以近似的得出来:

np(n)
1012%
2041%
3070%
5097%
10099.99996%
20099.9999999999999999999999999998%
3001 − (7 × 10−73)
3501 − (3 × 10−131)
≥366100%
比较 p(n) = 任意两个人生日相同概率 q(n) =和某人生日相同的概率

注意所有人都是随机选出的:作为对比,q(n)表示房间中 n个其他人中与特定人(比如你)有相同生日的概率:

 q(n) = 1- /left( /frac{364}{365} /right)^n

n = 22时概率只有大约0.059,约高于十七分之一。如果n个人中有50%概率存在某人跟有相同生日, n至少要达到253 。注意这个数字大大高于365/2 = 182.5: 究其原因是因为房间内可能有些人生日相同。

数学论证(非数字方法)

Paul Halmos 的自传中,他认为生日悖论仅通过数值上的计算来解释是一种悲哀。为此,Paul Halmos给出了一种概念数学方法的解释,下面就是这种方法(尽管这个方法包含一定的误差)。 乘积

/prod_{k=1}^{n-1}/left(1-{k /over 365}/right)}-

等于 1-p(n), 因此我们关注第一个n,使得乘积小于1/2,这样我们得到

/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)}-

由平均数不等式得:

/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}
=/left(1-{n /over 730}/right)^{n-1}</left(e^{-n/730}/right)^{n-1}=e^{-(n^2-n)/730}.}-

(我们首先利用已知的1到n-1所有整数和等于 n(n-1)/2, 然后利用不等式不等式 1-x < e−x.) 如果仅当

n^2-n>730/log_e 2/cong 505.997/dots

最后一个表达式的值会小于0.5。 其中"loge"表示自然对数。这个数略微小于506,运气稍微好一点点就可以达到506,等于n2n,我们就得到n=23。

在推导中,Halmos写道:

这个推导是基于一些数学系学生必须掌握的重要工具。生日问题曾经是一个绝妙的例子,用来演示纯思维是如何胜过机械计算:一两分钟就可以写出这些不等 式,而乘法运算则需要更多时间,并更易出错,无论使用的工具是一只铅笔还是一台老式电脑。计算器不能提供的是理解力,或数学才能,或产生更高级、普适化理 论的坚实基础。

然而Halmos的推导只显示至少需要23人保证平等机会下的生日匹配;因为我们不知道给出的不等式有多清晰,因此n=22能够正切的可能也无法确定。

泛化和逼近

生日悖论可以推广一下:假设有n 个,每一个人都随机地从1和特定的N个数中选择出来一个数(N可能是365或者其他的大于0的整数)。

p(n)表示有两个人选择了同样的数字,这个概率有多大?

下面的逼近公式可以回答这个问题

p(n)/sim 1-1//exp(n^2/(2N))./,

N=365的结果

File:050329-birthday2.png

泛化

下面我们泛化生日问题: 给定从符合离散均匀分布的区间[1,d]随机取出n个整数, 至少2个数字相同的概率p(n;d) 有多大?

类似的结果可以根据上面的推导得出。

p(n;d) = /begin{cases} 1-/prod_{k=1}^{n-1}/left(1-{k /over d}/right) & n/le d // 1 & n > d /end{cases}
p(n;d) /approx 1 - e^{-(n(n-1))/2d}
q(n;d) = 1 - /left( /frac{d-1}{d} /right)^n
n(p;d)/approx /sqrt{2d/ln/left({1 /over 1-p}/right)}}-

反算问题

反算问题可能是:

对于确定的概率 p ...
... 找出最大的 n( p)满足所有的概率 p( n)都小于给出的 p,或者
... 找出最小的 n( p) 满足所有的概率 p( n)都大于给定的 p

对这个问题有如下逼近公式:

n(p)/approx /sqrt{2/cdot 365/ln/left({1 /over 1-p}/right)}.

举例

逼近估计N :=365
pn 推广n <N :=365np(n↓)np(n↑)
0.01
0.14178 √N
2.70864
20.002743
0.00820
0.050.32029 √N6.1191660.0404670.05624
0.1
0.45904 √N
8.77002
80.074349
0.09462
0.2
0.66805 √N
12.76302
120.1670213
0.19441
0.30.84460 √N16.13607160.28360170.31501
0.51.17741 √N22.49439220.47570230.50730
0.71.55176 √N29.64625290.68097300.70632
0.81.79412 √N34.27666340.79532350.81438
0.92.14597 √N40.99862400.89123410.90315
0.952.44775 √N46.76414460.94825470.95477
0.99
3.03485 √N
57.98081
57
0.99012
580.99166

注意:某些值被着色,说明逼近 总是正确。

经验性测试

生日悖论可以用计算机代码经验性模拟

days := 365;
numPeople := 1;
prob := 0.0;
while prob < 0.5 begin
numPeople := numPeople + 1;
prob := 1 - ((1-prob) * (days-(numPeople-1)) / days);
print "Number of people: " + numPeople;
print "Prob. of same birthday: " + prob;
end;

应用

生日悖论普遍的应用于检测哈希函数:N-位长度的哈希表可能发生碰撞测试次数不是2N次而是只有2N/2次。这一结论被应用到破解密码学散列函数生日攻击中。

生日问题所隐含的理论已经在[Schnabel 1938]名字叫做capture-recapture的统计试验得到应用,来估计湖里鱼的数量。

不平衡概率

就像上面提到的,真实世界的人口出生日期并不是平均分布的。这种非均衡生日概率问题也已经被解决。[Klamkin 1967]

近似匹配

此问题另外一个范化就是求得要在随机选取多少人中才能找到2个人生日相同,相差1天,2天等的概率大于50% 。这是个更难的问题需要用到容斥原理。结果(假设生日依然按照平均分布)正像在标准生日问题中那样令人吃惊:

2人生日相差k天#需要的人数
0  23
1  14
2  11
3   9
4   8
5   7
7   6

只需要随机抽取6个人,找到两个人生日相差一周以内的概率就会超过50%。

 


http://chatgpt.dhexx.cn/article/sAnYGnsx.shtml

相关文章

生日悖论MATLAB仿真

生日悖论MATLAB仿真 终于熬过了这学期&#xff01;不知不觉大学的3/8已经过去了。回顾以下本学期让我印象最深刻&#xff0c;也最有成就感的事情是写出了我人生中第一个MATLAB程序&#xff01;由于先前零基础&#xff0c;所以从idea到code实现的整个过程是非常坎坷的QAQ那么话…

生日悖论 Birthday Paradox 至少有两人同一天生日概率

首先我们来看下生日悖论&#xff1a; 假设有n个人&#xff0c;365天的时间&#xff0c;假设所有人生日不相同的概率为&#xff08;1-P&#xff09; 第一个人可选择365 天中的任意365天&#xff0c;人数为1时所有人生日不相同的概率为365/365&#xff1b; 第二个人可选择365天…

【密码学/密码分析】生日悖论及生日攻击

生日悖论及生日攻击 鸽巢原理&#xff1a;给定n个鸽巢&#xff0c;至少存在n1只鸽子&#xff0c;那总是会发生碰撞。 概率环境&#xff1a;我们需要多少个物体&#xff08;鸽子&#xff09;使得发生碰撞的概率大于1/2&#xff1f; 答案是n1/2&#xff0c;而不是n/2。 举个例…

生日悖论的泛化问题的讨论

著名的生日悖论&#xff0c;不多言。 见维基百科&#xff1a; http://zh.wikipedia.org/wiki/%E7%94%9F%E6%97%A5%E6%82%96%E8%AE%BA 见百度百科&#xff1a; http://baike.baidu.com/view/859474.htm 摆渡、喂鸡&#xff0c;排名不分先后。 维基里面提到了泛化推广。生日…

关于生日悖论问题的验证

昨天在网上看到一个非常有意思的问题&#xff1a; 数学老师和体育老师打赌&#xff0c;数据老师认为在他们有50个人的班级里有两个生日是同一天的同学的概率远超没有的概率&#xff0c;反之是体育老师的观点。 第一次看到的时候我觉得这特数学老师才是教体育的吧&#xff0c; 我…

python生日悖论分析_生日悖论

python生日悖论分析 If you have a group of people in a room, how many do you need to for it to be more likely than not, that two or more will have the same birthday? 如果您在一个房间里有一群人&#xff0c;那么您需要多少个才能使两个或两个以上的人有相同的生日…

Birthday Paradox(生日悖论)(概率)

Birthday Paradox&#xff08;生日悖论&#xff09;&#xff08;概率&#xff09; judge&#xff1a;LightOJ - 1104 vjudge&#xff1a;vjudge Time limit&#xff1a;2000 ms Memory limit&#xff1a;32768 kB OS&#xff1a;Linux Source&#xff1a;Problem Setter: Jane…

用python整个活(3)——生日悖论:birthday paradox

&#x1f3c6;一、前言 别问我为啥题目是英文&#xff0c;因为…高大上&#xff08;bushi。 刷视频的时候偶然刷到了一个关于生日悖论的&#xff0c;当场就觉得不可思议&#xff0c;直到上网查了查…… 诶&#xff0c;怎么是真的&#xff1f; 这玩意儿居然还被设置到了密码…

【算法导论】生日悖论

生日悖论问题&#xff1a; 不考虑出生年份&#xff0c;问&#xff1a;一个房间中至少多少人&#xff0c;才能使其中两个人生日相同的概率达到50%? 解&#xff1a; 假设一年有 n 天&#xff0c;屋子中有 k 人&#xff0c;用整数 1, 2, …, k 对这些人进行编号。假定每个人的生日…

反直觉的「生日悖论」问题

点击蓝色“五分钟学算法”关注我哟 加个“星标”&#xff0c;一起学算法 作者 | labuladong 来源 | labuladong 生日悖论是由这样一个问题引出的&#xff1a;一个屋子里需要有多少人&#xff0c;才能使得存在至少两个人生日是同一天的概率达到 50%&#xff1f; 给你 5 秒钟随便…

浏览器不能展开全部内容/界面(展开更多点击无效果)

win10浏览器不能展开全部界面 1、按下“WinR”组合键&#xff0c;在框中输入“inetcpl.cpl”&#xff0c;点击确定打开“internet 选项”; 2、点击“高级”选卡&#xff0c;点击底部的“重置”按钮; 3、在“重置 Internet Explorer 设置”界面将“删除个人设置”选项勾选&…

CSDN文章自动展开全文无需登录插件(仅限Chrome)!

为什么80%的码农都做不了架构师&#xff1f;>>> 众所周知csdn里所有blog都记录了程序员们多年的技术积累&#xff0c;他们不吝啬技术&#xff0c;免费分享经验&#xff0c;随着资料的丰富&#xff0c;那些踩过的坑&#xff0c;报过的错&#xff0c;全被前人当成树种…

VSCode 代码块/全文 折叠/展开 快捷键

需求 && 操作 常用的两类场景(注意要操作的范围)&#xff1a; 要操作光标所在文件中的所有代码块&#xff1a; 折叠所有 CtrlK0展开所有 CtrlKJ 仅仅操作光标所处代码块内的代码&#xff1a; 折叠 CtrlShift[展开 CtrlShift] 更多操作 如果你有更多需求的话&#…

列表页面的展开以及收起

列表页面的展开以及收起 需求想法关键代码结尾 需求 由于公司新需求 &#xff0c;写一个列表页 &#xff0c;不上拉加载 &#xff0c;点击加载更多去加载 还会有收起按钮 。大概效果如下图所示&#xff1a; 想法 1&#xff0c;一开始想的是直接对数组进行切割 。然后每次点…

CSDN自动展开全文的插件

程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 1 分钟。 这个插件的名字叫&#xff1a;CsdnAutomaticallyOpen&#xff0c;今天刚撸的&#xff0c;下午有点时间再逛CSDN&#xff0c;每篇都要点击阅读全文&#xff0c;尤其是有的还要关注&#xff0c;受…

iOS使用YYLabel 点击展开和收起全文

看图说话比较清晰&#xff0c;点击红色标记的区域&#xff0c;会展开全文。 相关知识点 YYLabel&#xff0c;truncationTokenNSAttributedString&#xff0c;YYText&#xff0c;YYTextHighlight 我们来看一下YYLabel的属性truncationToken&#xff0c;是一个富文本&#xff0…

java爬取新浪微博带有“展开全文”的完整微博文本

获取新浪微博“展开全文”的完整文本 在个人主页的响应中&#xff0c;这篇微博的表示形式是这样的&#xff1a; <div class\"WB_text W_f14\" node-type\"feed_list_content\" nick-name\"Vista看天下\">\n 【一堂课…

uni-app,一段文字实现展开、收起全文点点点

效果&#xff1a; 思路&#xff1a; 1.根据文本显示的布局中&#xff0c;每行大致能显示的文字个数。&#xff08;实例是大致每行26个文字&#xff09; 2.首先加载页面时&#xff0c;根据文字总长度判断是否超出自定义行数&#xff0c;来处理相应的数据&#xff0c;多余自定义…

CSDN阅读全文自动展开插件,安排上!

TJ平时经常利用一些碎片时间逛逛CSDN&#xff0c;由于是碎片时间&#xff0c;往往都是看到哪是哪&#xff0c;所以也没有登录&#xff0c;于是会碰到一个情况&#xff0c;就是看到一篇文章觉得不错&#xff0c;刚看了两句就让点击展开全文&#xff0c;点击之后还要求登录才行&a…

uni-app中,文字超出隐藏并显示省略号(实现展开、收起全文)

一、uni-app中&#xff0c;固定宽高&#xff0c;文字超出部分&#xff0c;隐藏并显示省略号。 .topic_cont_text{padding: 30upx;colof: #999;background: #E1FFFF;max-height: 130upx;overflow: hidden;word-break: break-all; /* break-all(允许在单词内换行。) */text-ov…