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

Python骰子游戏模拟:如何计算50次运行后平均roll_count/run值

骰子游戏期望计算与代码修正

一、问题说明

你最多可投掷骰子6次,可随时停止,获得与当前投掷点数等额的美元奖励。本次规则为持续投掷直到得到大于等于4的点数即停止,求单次游玩的平均收益,以及最大投掷次数从6下调为4时的结果变化。

二、原有代码问题排查

原有代码输出平均投掷次数异常的核心原因如下:

  • 未设置变量累计所有轮次的总投掷次数,仅在每轮循环内错误计算单轮投掷次数除以当前轮次的比值,最终输出的是最后一轮的1/50=0.02,完全不符合统计逻辑
  • 收益统计存在边界漏洞:如果连续3次都掷出小于4的点数,第4次没有取值逻辑,会沿用上一轮的收益值,导致收益统计错误
  • 缺少平均收益的统计逻辑,没有累计每轮的总收益来计算均值

三、修正后代码

import random

total_runs = 50  # 总试验次数
max_rolls = 4  # 最大投掷次数,可修改为6测试不同结果
total_roll_count = 0
total_prize = 0

for run in range(1, total_runs + 1):
    roll_count = 0
    current_prize = 0
    while roll_count < max_rolls:
        roll_count += 1
        a = random.randint(1, 6)
        if a >= 4:
            current_prize = a
            break
    # 若到最大投掷次数仍未触发停止,取最后一次的点数
    if current_prize == 0:
        current_prize = a
    # 累计数据
    total_roll_count += roll_count
    total_prize += current_prize
    # 打印单轮结果
    print(f"Trial Run: {run}")
    print(f"Times rolled: {roll_count}")
    print(f"Your prize: {current_prize}\n")

# 计算均值
avg_rolls = total_roll_count / total_runs
avg_prize = total_prize / total_runs
print(f"Average rolls: {avg_rolls}")
print(f"Average prize: {avg_prize}")

四、理论计算结果

平均收益

我们通过递推计算期望:设E(n)为剩余n次投掷机会的期望收益,单次掷出≥4点数的概率为1/2,对应点数均值为5;掷出<4点数的概率为1/2,对应点数均值为2。

  • 仅剩余1次投掷机会时,期望收益E(1) = (1+2+3+4+5+6)/6 = 3.5
  • 剩余n次机会时,期望收益公式为E(n) = 0.5*5 + 0.5*E(n-1)
    • 最大投掷次数为6时:E(6) ≈ 4.95美元
    • 最大投掷次数为4时:E(4) ≈ 4.81美元

平均投掷次数

  • 最大投掷次数为4时,理论平均投掷次数为1.4375次
  • 最大投掷次数为6时,理论平均投掷次数为1.96875次

调整最大投掷次数的影响

最大投掷次数从6下调为4后,平均收益会降低约0.14美元,平均投掷次数会减少约0.53次。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:45:05