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

基于蒙特卡洛估计的Craps骰子游戏Python代码问题排查

代码问题分析与修复

核心问题总结

你的代码无法正确输出获胜概率,主要是变量作用域错误、return语句逻辑无效、循环逻辑漏洞这三个问题导致的,具体拆解如下:


1. 变量作用域错误

win_count是定义在simulate()函数内部的局部变量,主逻辑部分根本访问不到它,最后执行print(win_count / 1000)会直接抛出NameError,这是程序无有效输出的直接原因。

2. return语句后的代码永远不会执行

比如第一个if分支里,return True之后的win_count +=1完全是无效代码——函数一旦执行return就会立即退出,后续代码根本没机会运行。而且simulate()函数的返回值逻辑混乱:有时候返回布尔值(True/False),有时候返回win_count,完全不符合统计逻辑。

3. 循环逻辑漏洞

在初始点数不是立即胜负的情况下,你的while循环存在两个致命问题:

  • 循环内部没有重新投掷骰子,一旦进入循环就会无限死循环;
  • 循环条件和内部判断逻辑冲突,while roll != new_roll and roll !=7的条件下,内部的new_roll == roll或new_roll ==7永远不会成立,循环永远停不下来。

修复后的代码

把simulate()改成仅返回当前试验是否获胜(True/False),然后在主逻辑里统一统计获胜次数:

from random import randint

def simulate():
    # 第一次投掷
    die1 = randint(1, 6)
    die2 = randint(1, 6)
    roll = die1 + die2

    if roll == 7 or roll == 11:
        return True
    elif roll == 2 or roll == 3 or roll == 12:
        return False
    else:
        # 重复投掷直到分出胜负
        while True:
            die1 = randint(1, 6)
            die2 = randint(1, 6)
            new_roll = die1 + die2
            if new_roll == roll:
                return True
            elif new_roll == 7:
                return False

# 主逻辑:统计1000次试验的获胜次数
win_count = 0
for _ in range(1000):
    if simulate():
        win_count +=1

print(f"获胜概率:{win_count / 1000}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:30:45