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美元
- 最大投掷次数为6时:
平均投掷次数
- 最大投掷次数为4时,理论平均投掷次数为
1.4375次 - 最大投掷次数为6时,理论平均投掷次数为
1.96875次
调整最大投掷次数的影响
最大投掷次数从6下调为4后,平均收益会降低约0.14美元,平均投掷次数会减少约0.53次。
内容的提问来源于stack exchange,提问作者Maverick
相关产品推荐
相关产品推荐

