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

运行生日悖论模拟代码时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:33:29