三门问题详解+python模拟
最近看了一个很有趣的问题:三门问题
问题简述:
一个抽奖游戏。从三扇门(其中有两扇门后羊,一扇门后是车)中选中门后有汽车的门。
参赛者一开始从3个门里面选一个门(先不打开门)
然后主持人(主持人知晓门后的情况)把另一个门后是羊的门打开
最后只剩两扇未知的门,问你要不要把原来的选择换成另一扇门。
答案:
要换,换了之后,选中车的概率是2/3,选中羊的概率是1/3。
这个问题一开始看了好多解说都觉得好难理解,直到我看了李永乐老师的科普视频之后,恍然大悟!李老师的b站视频
疑惑:
大多数人会觉得,最后只剩2扇门(其中一扇是你一开始选的),二选一,应该是1/2的概率才对,但是注意了。。你一开始选的门是在原来的3扇门中选的,而不是在后面的两扇门中选的,所以这扇门是车的概率是1/3,不是1/2。主持人的操作不影响它的概率。
解答:
-
我们先看不换的情况:
因为不换门,后面主持人怎么操作,对概率没有影响。就是三选一。
所以:车的概率:1/3, 羊的概率:2/3 -
换的情况:
这里注意,主持人把其中一扇羊门打开,所以只剩下一扇车门和一扇羊门。换门就等于改变结果。
一开始选的如果是车的门,换了另一扇门肯定是羊的门;同理,一开始选的如果是羊的门,换了就是车。
那我问你
一开始选中车的概率是多少?1/3。
一开始选中羊的概率多少?2/3。
你说换不换?肯定换啊!因为一开始选的很可能不是车,有2/3的概率是羊,最后换个门就反转了,有2/3的概率是中车。
所以:车的概率:2/3, 羊的概率:1/3
图:

看图也看的出来,一开始选的羊的,换门后都变成车了
总结:
不换门:中车的概率:1/3, 中羊的概率:2/3
换门:中车的概率:2/3, 中羊的概率:1/3
其实并不是条件概率,只是反转而已。主持人把一扇羊门打开后,换门就会反转结果。
举一反三:
如果有100扇门,只有一扇门后是车,规则也一样,主持人在你选了一扇门后,把另外的羊门打开,只剩两扇门,这时候怎么考虑呢?
只剩最后两扇门的时候,和三门问题一样,换门是会反转结果的,所以换门是最好选择,因为你一开始有99/100的概率选中的是羊。换了之后会反转,羊换车,变成99/100的概率选中车。
不换门:中车的概率:1/100, 中羊的概率:99/100
换门:中车的概率:99/100, 中羊的概率:1/100
题外话:
主持人那么好都帮你把其他无关选项都排除了。肯定要换啊。。你一开始选的门中车概率比较低,很不靠谱的。
python程序模拟:
import randomclass MontyHallGame:def __init__(self, door_cnt=3):self.door_cnt = door_cnt # door_cnt >= 3self.door_arr = [False] * door_cnt # False: Goat, True: Carself.door_arr[random.randint(0, door_cnt - 1)] = Truedef play(self, select_idx, exchange):if exchange:# 不管几道门,最后都会只剩下两道门给你选择,互为对立面,一门有车,一门有羊# 选了车的,换门后就是羊;同理选了羊的,换门后就是车# 所以只要反转一下结果就行,不用再模拟主持人的开门操作了return not self.door_arr[select_idx]else:return self.door_arr[select_idx]if __name__ == '__main__':game_times = 100000# test1door_cnt = 3print('{}道门,换与不换各自都玩{}盘游戏'.format(door_cnt, game_times))# 不换门car_cnt = 0for i in range(game_times):game = MontyHallGame()select_door = random.randint(0, game.door_cnt - 1)result = game.play(select_door, False)car_cnt += 1 if result else 0print('不换门的情况:选中车的有{}盘,选中车的比例{}'.format(car_cnt, car_cnt / game_times))# 换门car_cnt = 0for i in range(game_times):game = MontyHallGame()select_door = random.randint(0, game.door_cnt - 1)result = game.play(select_door, True)car_cnt += 1 if result else 0print('换门的情况:选中车的有{}盘,比例{}'.format(car_cnt, car_cnt / game_times))print()# test2door_cnt = 10print('{}道门,换与不换各自都玩{}盘游戏'.format(door_cnt, game_times))# 不换门car_cnt = 0for i in range(game_times):game = MontyHallGame(door_cnt)select_door = random.randint(0, game.door_cnt - 1)result = game.play(select_door, False)car_cnt += 1 if result else 0print('不换门的情况:选中车的有{}盘,选中车的比例{}'.format(car_cnt, car_cnt / game_times))# 换门car_cnt = 0for i in range(game_times):game = MontyHallGame(door_cnt)select_door = random.randint(0, game.door_cnt - 1)result = game.play(select_door, True)car_cnt += 1 if result else 0print('换门的情况:选中车的有{}盘,比例{}'.format(car_cnt, car_cnt / game_times))print()# test3door_cnt = 100print('{}道门,换与不换各自都玩{}盘游戏'.format(door_cnt, game_times))# 不换门car_cnt = 0for i in range(game_times):game = MontyHallGame(door_cnt)select_door = random.randint(0, game.door_cnt - 1)result = game.play(select_door, False)car_cnt += 1 if result else 0print('不换门的情况:选中车的有{}盘,选中车的比例{}'.format(car_cnt, car_cnt / game_times))# 换门car_cnt = 0for i in range(game_times):game = MontyHallGame(door_cnt)select_door = random.randint(0, game.door_cnt - 1)result = game.play(select_door, True)car_cnt += 1 if result else 0print('换门的情况:选中车的有{}盘,比例{}'.format(car_cnt, car_cnt / game_times))# 结果
# 3道门,换与不换各自都玩100000盘游戏
# 不换门的情况:选中车的有33430盘,选中车的比例0.3343
# 换门的情况:选中车的有66552盘,比例0.66552
#
# 10道门,换与不换各自都玩100000盘游戏
# 不换门的情况:选中车的有10176盘,选中车的比例0.10176
# 换门的情况:选中车的有90055盘,比例0.90055
#
# 100道门,换与不换各自都玩100000盘游戏
# 不换门的情况:选中车的有1003盘,选中车的比例0.01003
# 换门的情况:选中车的有99019盘,比例0.99019
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
