基于蒙特卡洛估计的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
相关产品推荐
相关产品推荐

