Python 3蒙特霍尔游戏模拟器输出错误及功能实现咨询
嘿,我帮你重构了蒙特霍尔游戏模拟器,解决了输入验证、循环操作的需求,同时也修正了可能导致错误输出的常见问题。下面是完整的可运行代码,我会一步步拆解关键部分:
完整重构后的蒙特霍尔模拟器代码
import random def monty_hall_simulation(): while True: # 处理随机种子输入 while True: seed_input = input('Enter a random seed: ') try: seed = int(seed_input) random.seed(seed) break except ValueError: print('错误:请输入有效的数字!') # 处理测试次数输入 while True: try: test_count = int(input('请输入测试次数:')) if test_count <= 0: print('错误:测试次数必须是正整数!') continue break except ValueError: print('错误:请输入有效的数字!') # 初始化统计变量 stay_wins = 0 switch_wins = 0 # 运行测试 for _ in range(test_count): # 初始化门:0代表无奖品,1代表有奖品 doors = [0, 0, 0] prize_door = random.randint(0, 2) doors[prize_door] = 1 # 用户选择门 user_choice = random.randint(0, 2) # 主持人打开一扇没有奖品且不是用户选的门 host_options = [i for i in range(3) if i != user_choice and doors[i] == 0] host_opened = random.choice(host_options) # 计算换门后的选择 switch_choice = [i for i in range(3) if i != user_choice and i != host_opened][0] # 统计结果 if doors[user_choice] == 1: stay_wins += 1 if doors[switch_choice] == 1: switch_wins += 1 # 输出测试结果 print(f"\n{test_count}次测试结果:") print(f"不换门获胜次数:{stay_wins},胜率:{stay_wins/test_count:.2%}") print(f"换门获胜次数:{switch_wins},胜率:{switch_wins/test_count:.2%}") # 询问后续操作 while True: next_action = input("\n请选择后续操作:\n1. 用当前种子继续测试\n2. 重新输入随机种子\n3. 退出程序\n输入选项编号:") if next_action == '1': break # 回到测试次数输入步骤 elif next_action == '2': break # 回到种子输入步骤 elif next_action == '3': print("程序结束!") return else: print('错误:请输入有效的选项编号(1/2/3)!') if __name__ == "__main__": monty_hall_simulation()
关键部分解析
1. 随机种子输入验证
我用了嵌套循环+try-except处理输入:如果用户输入的不是数字,会触发ValueError,这时打印错误提示并让用户重新输入,直到输入有效的整数为止。同时用random.seed(seed)固定随机数生成器,保证每次用相同种子时结果一致,方便调试。
2. 测试次数输入验证
同样用try-except处理非数字输入,额外加了判断确保测试次数是正整数——毕竟0次或负数次测试没有意义,这里会专门提示用户修正。
3. 蒙特霍尔核心逻辑
这部分是避免错误输出的关键:
- 明确用
doors列表标记奖品位置,避免逻辑混淆 - 主持人开门时严格筛选不是用户选择且没有奖品的门,不会出现开错门的情况
- 换门的选择通过排除用户原选择和主持人打开的门来确定,逻辑严谨,不会出现索引错误
4. 循环操作逻辑
测试完成后,给用户三个清晰的选项:继续用当前种子测试、重新输入种子、退出。同样做了输入验证,确保用户只能输入有效选项,避免程序崩溃。
常见的错误输出原因比如:随机数没有正确初始化、主持人开门逻辑错误(比如开到有奖品的门)、统计时计数错误,这些在重构后的代码里都做了规避。
内容的提问来源于stack exchange,提问作者user9317683
相关产品推荐
相关产品推荐

