You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3生日悖论蒙特卡洛模拟 求解存在同生日概率的实现问题

生日悖论概率计算修正

原有代码的问题

  • 仅对每个房间人数做了1次随机试验,结果波动极大
  • 计算的rep/j是单次试验中共享生日的人数占比,并非「存在至少一对生日相同」的事件概率

修正逻辑

对每个固定的房间人数,执行多轮独立随机试验,统计出现生日重复的试验占比,即为目标概率:

  1. 设定单个人数下的重复试验次数(比如10000次,可根据精度需求调整)
  2. 每次试验生成对应人数的随机生日列表,通过集合去重后和原长度对比即可快速判断是否存在重复
  3. 概率 = 出现重复的试验次数 / 总试验次数

修正后代码

import numpy as np
import matplotlib.pyplot as plt

# 配置参数
max_people = 100  # 最多统计到100人即可,23人左右概率就超过50%
test_times_per_n = 10000  # 单个人数下的试验次数,次数越高结果越平滑

x = list(range(2, max_people + 1))
y = []

for n in x:
    repeat_count = 0
    for _ in range(test_times_per_n):
        # 生成n个生日
        birthdays = np.random.randint(low=1, high=366, size=n)
        # 集合去重后长度小于n说明存在重复生日
        if len(set(birthdays)) < n:
            repeat_count += 1
    # 计算当前人数下的目标概率
    prob = repeat_count / test_times_per_n
    y.append(prob)
    print(f"人数{n},概率{prob:.4f}")

# 绘制曲线
plt.plot(x, y)
plt.xlabel("房间人数")
plt.ylabel("至少一对生日相同的概率")
plt.grid(True)
plt.show()

优化说明

用len(set(birthdays)) < n判断重复,比原有遍历计数频次的写法效率高2~3个数量级,方便你调高超多次试验的上限,进一步降低结果波动。

内容的提问来源于stack exchange,提问作者user16116851

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:36:06