今天发现个有趣的问题,和选择有关,我们来看一看。
故事背景
蒙提霍尔问题,又叫做三门问题。美国有一个电视节目“Let's Make a Deal”,主持人就叫做蒙提·霍尔,游戏规则是这样的:
参赛者面前会与3扇门,其中一扇后面是一辆车,另两扇后面是山羊。参赛者首先会选择一扇门,然后,主持人会打开一扇有山羊的门,并问参赛者,是否要更改选择。
参赛者该如何选择才能由更高的概率选中车呢?
这个问题当时引起了很大的反响,产生激烈的讨论,主要有2种答案,一种是概率一样50%,另一种是换概率更高,有2/3。
分析
一开始感觉,换不换都一样,概率都是1/2,
一开始,有 1车,2羊,选中车的概率是1/3,去掉一个错误答案,就只剩下1车,1羊,选中车概率变成1/2了。
这个看上去好像没毛病,但实际上并不对,我们进入了一个误区。
最开始我们选中车的概率是1/3,后面虽然去掉了一个错误答案,但是第一次选择的概率是不会变的,依然是1/3
选中车的概率没有变,但是主持人方只剩下一个选项,我们选择换,中奖的概率会更高。
其实核心的问题,就是你一开始选择,有多大的概率可以选中?
python验证
看很多朋友都写了代码来验证,我这里也写下
# -*- coding: utf-8 -*-
"""
Created on 2018-09-01 15:59:45
@author: guiyang.yu
@description: 三门问题
"""
class ThreeDoor:
#选项初始化
doors=['车','羊','羊']
def is_car(self,choose):
return choose==0
def get_goat(self,choose):
if choose==1:
return 2
else:
return 1
#不换,则只是选择1次,就看是否选中车
def no_change(self,choose):
return self.is_car(choose)
#换,则剔除当前选项和随便一只羊的选项
def change(self,choose):
options=[0,1,2]
#剔除当前选项
options.remove(choose)
#剔除任意一只羊的选项
options.remove(self.get_goat(choose))
return self.is_car(options[0])
import random
door=ThreeDoor()
total_count=10000
success_count_nochange=0
success_count_change=0
for i in range(total_count):
choose=random.randint(0,2)
if door.no_change(choose):
success_count_nochange=success_count_nochange+1
if door.change(choose):
success_count_change=success_count_change+1
print('total count:',total_count)
print('success count of no change:',success_count_nochange)
print('success count of change:',success_count_change)
print('success rate of no change:',round(success_count_nochange/total_count,4))
print('success rate of change:',round(success_count_change/total_count,4))
执行后,数据如下:
小结
真相就是这样,在每一次做选择的时候,都很重要啊,而且知识改变命运,学好概率,掌握人生啊。