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
相关产品推荐
相关产品推荐

