生日悖论是一个概率论中的现象,它说明了在一定的条件下,一个不太可能的偶然事件发生的概率会比直觉认为的要大得多。具体来说,生日悖论指的是,在一个随机选择的23人群体中,至少有两个人生日相同的概率超过50%。
假设一个班级有23个学生,我们可能会直觉地认为班级里至少有两个人生日相同的概率很低。但实际上,我们可以这样计算:第一个学生的生日可以是任意一天,第二个学生的生日与第一个学生不同的概率是364/365,第三个学生的生日与前两个都不同的概率是363/365,以此类推。当计算到第23个学生时,至少有两个人生日相同的概率已经超过了50%。
具体计算如下:
所以,23个人中至少有两个人生日相同的概率大约是50.73%。
在很多人看来,这个概率出人意料地高。如果你对这个结论持怀疑态度,还可以利用计算机生成随机数进行模拟试验。
代码1:生日悖论模拟试验
import random
def birthday_paradox试验(人数, 试验次数):
生日相同次数 = 0
for _ in range(试验次数):
生日列表 = [random.randint(1, 365) for _ in range(人数)]
if len(生日列表) != len(set(生日列表)):
生日相同次数 += 1
return 生日相同次数 / 试验次数
# 设置人数为23,试验次数为10000次
人数 = 23
试验次数 = 10000
概率 = birthday_paradox试验(人数, 试验次数)
print(f"在{人数}个人中,至少有两个人生日相同的概率为:{概率:.4f}")
以上代码通过随机模拟10000次试验来计算概率,输出结果可能在50%到52%之间波动,但总体上会接近理论值 50.73%。
而如果一个班级的人数是50人,至少有两个同学同一天生日的概率大约是97.04%。如果让这个概率超过99%,班级中至少需要有57名学生。由此可见在一个50-60人的班级里,至少有两个同学在同一天过生日完全是个大概率事件。
代码2:50人班级里至少有两个同学同一天生日的概率
from math import factorial
def calculate_probability(n, k):
# Probability that no one shares a birthday
prob_no_shared = 1
for i in range(n):
prob_no_shared *= (k - i) / k
# Probability that at least two people share a birthday
prob_shared = 1 - prob_no_shared
return prob_shared
# Calculate the probability for a class of 50 students
probability_50_students = calculate_probability(50, 365)
probability_50_students
import math
# Setting the target probability
target_probability = 0.99
# Initial values
n = 0
probability = 0
# Incrementing n until the probability is above the target
while probability < target_probability:
n += 1
probability = 1 - math.prod([(365 - i) / 365 for i in range(n)])
n
生日悖论在算法中的应用主要体现在概率算法和蒙特卡洛方法上。这些算法利用了生日悖论中的概率原理,通过随机抽样来估计某个问题的解。例如,在密码学中,生日攻击是一种利用生日悖论原理来破解哈希函数的攻击方式。
探索更多生日悖论对计算机算法的启发,推荐你阅读《算法导论》。
延伸阅读
▼
推荐理由:MIT四大名师联手铸就。算法标准教材,国内外千余所高校采用!影响全球千万程序员!本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。
本文来源:原创,图片来源:原创、AI生成
责任编辑:郑琳琳,部门领导:宁姗
发布人:白钰