终于有人把生日悖论讲明白了

生日悖论是一个概率论中的现象,它说明了在一定的条件下,一个不太可能的偶然事件发生的概率会比直觉认为的要大得多。具体来说,生日悖论指的是,在一个随机选择的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

  • 代码3:两个同学同一天生日的概率超过99%,班级里至少有多少人

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)])

生日悖论在算法中的应用主要体现在概率算法和蒙特卡洛方法上。这些算法利用了生日悖论中的概率原理,通过随机抽样来估计某个问题的解。例如,在密码学中,生日攻击是一种利用生日悖论原理来破解哈希函数的攻击方式。

探索更多生日悖论对计算机算法的启发,推荐你阅读《算法导论》。

推荐理由:MIT四大名师联手铸就。算法标准教材,国内外千余所高校采用!影响全球千万程序员!本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。

购买链接自取:

当当:https://product.dangdang.com/22927209.html
京东:https://item.jd.com/11144230.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I'mAlex

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值