运行生日悖论模拟代码时for循环错误排查与修复方案
生日悖论模拟代码错误排查
原代码存在以下核心问题,直接导致运行报错、结果错误:
- 人数列表定义错误:初始
num_people = [2,80]仅包含2、80两个值,不符合需求中2-80所有整数人数的要求 - 变量名冲突:全局列表名
num_people/prob_matches和函数形参重名,运行时会出现变量覆盖的逻辑混乱 - 全局列表污染:函数内部直接操作全局
prob_matches列表,每次运行不会清空历史数据,多次调用后概率计算结果完全失真 - 模拟逻辑缺失:仅对人数=80的场景跑了单次模拟,没有遍历2-80所有人数分别计算对应匹配概率
- DataFrame构造逻辑错误:最后仅定义了一个存储列名的普通列表,没有调用pandas的DataFrame构造方法传入实际数据
- 依赖缺失:代码没有提前导入
pandas、random依赖库,运行会直接报模块不存在错误
正确可运行实现
# 导入依赖 import pandas as pd import random def birthday_sim(people_count, num_sims=1000): """ 单个人数规模下的生日悖论模拟 :param people_count: 班级总人数 :param num_sims: 模拟迭代次数,次数越大概率越接近理论值 :return: 至少两人生日相同的模拟概率 """ possible_birthdays = range(365) match_count = 0 for _ in range(num_sims): # 随机生成对应人数的生日,用集合快速判断是否存在重复 birthdays = random.choices(possible_birthdays, k=people_count) if len(set(birthdays)) < people_count: match_count += 1 return match_count / num_sims # 生成2-80的人数序列 num_people = list(range(2, 81)) # 遍历每个人数计算对应概率 prob_matches = [birthday_sim(n) for n in num_people] # 构造目标DataFrame birthday_problem_df = pd.DataFrame({ "num_people": num_people, "prob_matches": prob_matches }) # 测试查看结果(可选) print(birthday_problem_df.head()) print(f"20人场景匹配概率:{birthday_sim(20):.2%}") print(f"80人场景匹配概率:{birthday_sim(80):.2%}")
代码说明:去掉了原逻辑中冗余的pandas Series转换步骤,用原生集合判断重复,运行效率提升明显;模拟次数默认1000次,若需要更精准的结果可以将
num_sims调大到10000,结果会更接近理论概率(23人时概率约50%,60人时概率约99%)。
内容的提问来源于stack exchange,提问作者Marie B
相关产品推荐
相关产品推荐

