Python3生日悖论蒙特卡洛模拟 求解存在同生日概率的实现问题
生日悖论概率计算修正
原有代码的问题
- 仅对每个房间人数做了1次随机试验,结果波动极大
- 计算的
rep/j是单次试验中共享生日的人数占比,并非「存在至少一对生日相同」的事件概率
修正逻辑
对每个固定的房间人数,执行多轮独立随机试验,统计出现生日重复的试验占比,即为目标概率:
- 设定单个人数下的重复试验次数(比如10000次,可根据精度需求调整)
- 每次试验生成对应人数的随机生日列表,通过集合去重后和原长度对比即可快速判断是否存在重复
- 概率 = 出现重复的试验次数 / 总试验次数
修正后代码
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
相关产品推荐
相关产品推荐

