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

Python模拟蒙提霍尔问题时,调用notThese函数导致结果异常的问题求助

Python模拟蒙提霍尔问题时,调用notThese函数导致结果异常的问题求助

嘿,我来帮你分析下问题出在哪!首先,你的notThese函数本身是没问题的,它确实能返回1-3中排除两个数后的第三个数。真正的问题出在你的代码逻辑流程上,和函数调用无关。

你看,当前代码里有个关键的错误:当你一开始选对门(chosenDoor == correct)的时候,直接给wins加1就continue跳过了后续逻辑,但此时你设置了change = True——按照蒙提霍尔问题的规则,这时候你应该执行换门操作,然后输掉才对,但你的代码直接算成赢了!

而当你一开始选错门的时候,不管用notThese(openedDoor, chosenDoor)还是你注释掉的那段循环,最终都会把chosenDoor改成正确的门,所以这部分肯定会赢。加上前面选对门直接算赢的情况,自然所有尝试都变成胜利了。

至于你说替换成注释代码就正常,大概率是你替换的时候不小心调整了其他逻辑,或者是测试时的偶然情况——从代码逻辑上看,那段注释代码和notThese调用的功能完全一致,都会返回排除两个门后的第三个门,不可能出现结果差异。

给你修正一下代码,把换门逻辑放在判断胜负之前,不管一开始选对选错都执行换门(当change=True时):

import random

def notThese(num1, num2):
    for j in range(1,4):
        if j != num1 and j != num2:
            return j
                
i=0
wins= 0

change = True
times = 9000

while i <= times:
  i += 1
  correct = random.randint(1,3)
  chosenDoor = random.randint(1,3)
  
  if change:
    # 主持人开门逻辑:如果一开始选对了,随机开一个错误门;选错了,开另一个错误门
    if chosenDoor == correct:
        openedDoor = random.choice([j for j in range(1,4) if j != chosenDoor])
    else:
        openedDoor = notThese(chosenDoor, correct)
    # 执行换门
    chosenDoor = notThese(openedDoor, chosenDoor)
  
  # 最后统一判断是否获胜
  if chosenDoor == correct:
      wins += 1
    
print(wins)

运行这段代码,你会发现胜率大概在2/3左右(9001次的话,wins接近6000),符合蒙提霍尔问题的预期。

备注:内容来源于stack exchange,提问作者Dan Seminara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:48:10