羊车门问题

羊车门问题分析

 

         题目描述:有3扇关闭的门,一扇门后面停着汽车,其余门后是山羊,只有主持人知道每扇门后面是什么。参赛者可以选择一扇门,在开启它之前,主持人会开启另外一扇门,露出门后的山羊,然后允许参赛者更换自己的选择。

 

作业要求如下,需在博文中回答如下问题,回答问题时,先复制题目,然后再换行书写答案:

 

1、按照你的第一感觉回答,你觉得不换选择能有更高的几率获得汽车,还是换选择能有更高的几率获得汽车?或几率没有发生变化?

 

答:我当时觉得肯定是不更换选择 获得汽车的概率高啊,因为最开始获得汽车的概率是1/3,假如更换了的话肯定没这么高的概率啦。所以当老师说:“ 觉得不更换选择获得汽车的几率更高的同学举下手。”,我高高举起的手微微颤抖。。。。

 

 

2、请自己认真分析一下“不换选择能有更高的几率获得汽车,还是换选择能有更高的几率获得汽车?或几率没有发生变化?” 写出你分析的思路和结果。

 

答:①这是参赛者不更换选择的情况,假如参赛者相信自己的直觉不更换选择的话,获得汽车的概率是1/3;②这是参赛者更换选择的情况,假如参赛者第一次选中了汽车门(概率1/3)并且换了的话,最终肯定是不能得到汽车的,故排除这种可能;③假如参赛者第一次选中的是羊门且选择更换(由于主持人打开了一扇羊门了,所以更换选择后一定是车门),这种情况选中汽车门的总概率是2/3;额,这个就很尴尬啦,如果我这个分析没错的话吗,仔细分析一波之后,和我最初的猜想不一样。What the hell!!!

 

 

3、请设法编写程序验证自己的想法,验证的结果支持了你的分析结果,还是没有支持你的分析结果,请写出程序运行结果,以及其是否支持你的分析。(提示:可以借助随机数函数完成此程序)

 

答: 额,先说点废话吧。我觉得我做这道羊车门问题还是挺失败的。我看了这道题的题目之后,并没有想着直接去啪嗒啪嗒地直接去敲键盘计算概率,而是想着先编写代码去模拟这个参赛者和主持人互动的这个过程,再来计算概率,没办法 这就是我这个LZ的解题思路。个人感觉真的是很艰辛的,一点一点地去试错。然后再在这个基础之上去计算概率。在模拟参赛者和主持人互动的这个过程中,我这个python小白新学会了random.sample(list,n)去在列表list中随机获取n个元素组成片段。直接结合代码旁边的注释去理解我这个LZ的思路吧,真的是呕心沥血地敲(xie)代码(BUG),现在已经是凌晨啦,关键还是我太菜了,一道这种题居然要这么久才能解决。

 

4、我的代码。

额,先来看第一段代码吧,这个没有用来计算概率,是模拟参赛者和主持人互动的整个过程,不喜勿喷,如有错误请在评论区指出。

 

 1 #假设有3扇门,序号为1,2,3,根据参赛者输入的数字来开门
 2 #假设用户输入非常友好啊,不会非法输入,所以小白这段代码没有健壮性
 3 # coding: utf-8
 4 import random as rd #引入随机数
 5 print("已知有3扇关闭的门,序号为1,2,3,一扇门后面停着汽车,其余门后是山羊")
 6 l = [1,2,3] #列表l内的元素表示3个门
 7 car = rd.randint(1,3) #在1,2,3这三扇门之间产生随机数
 8 x = eval((input("请选择参赛者想要开的门:")))  #x为参赛者他选择的门
 9 l.remove(x) #主持人在开启参赛者选择的门前,会先开启另外一扇门
10 if x != car: #防止参赛者选择的门正好是车门,但x已不在列表的情况
11     l.remove(car) #主持人已经知道了哪个是车门,且依据题意,第一次不会打开那扇车门,会打开一扇羊门
12 s = rd.sample(l,1) #从列表l中随机获取5个元素,作为一个片断s返回,这样可以防止x=car时,列表l中还存在两个值
13 for i in s:  #i为主持人要打开的那扇门
14     y = i #y为主持人第一次打开的那扇门
15     print("主持人打开了第{}扇门,露出了门后的山羊".format(y)) #主持人打开所谓的另外一扇门,露出门后的山羊
16 l = [1,2,3]    #列表l内的元素表示3个门
17 n = input("参赛者是否更换选择:1.更换选择 2.不更换,相信自己的直觉")
18 if n == 1:  #若参赛者更换选择
19     l.remove(x) #参赛者要求更换选择,所以不可能取到再在列表l中取到当初输入的那个数x
20     l.remove(y) #主持人已经打开了这扇门,所以也不可能再取到
21     for j in l: #j为参赛者更换选择后 他所选择的那扇门
22         print("参赛者更换了选择,主持人打开了参赛者选择的第{}扇门".format(j))
23     if j == car:  #判断参赛者最终选择的门是否为车门
24         print("参赛者获得了汽车")
25     else:
26         print("很遗憾,这扇门后面是山羊")
27 if n == 2:  #若参赛者没有更换选择,相信自己的直觉
28     print("参赛者没有更换选择,主持人打开了参赛者选择的第{}扇门".format(x))
29 if x == car:
30     print("参赛者获得了汽车")
31 else:
32     print("很遗憾,这扇门后面是山羊")

 

下面来看计算概率的那段代码,为了节省计算时间,我只算了更换选择后抽中汽车的概率,因为与它对立的一定就是没有更换选择的情况下抽中汽车的概率。

 

 1 #假设有3扇门,序号为1,2,3,根据参赛者输入的数字来开门
 2 #假设用户输入非常友好啊,不会非法输入,所以小白这段代码没有健壮性
 3 # coding: utf-8
 4 import random as rd #引入随机数
 5 times = 100000  #在此处定义循环次数,便于更换循环次数
 6 count = 0     #用total来记录参赛者更换选择后抽中汽车的次数
 7 print("已知有3扇关闭的门,序号为1,2,3,一扇门后面停着汽车,其余门后是山羊")
 8 car = rd.randint(1,3) #在1,2,3这三扇门之间产生随机数
 9 for k in range(times):
10     l = [1,2,3] #列表l内的元素表示3个门
11     x = rd.choice(l) #x为参赛者他选择的门
12     for a in range(1,4):
13         if a == x:
14             l.remove(a) #主持人在开启参赛者选择的门前,会先开启另外一扇门
15             if a != car: #防止参赛者选择的门正好是车门,但x已不在列表的情况
16                 l.remove(car) #主持人已经知道了哪个是车门,且依据题意,第一次不会打开那扇车门,会打开一扇羊门
17     s = rd.sample(l,1) #从列表l中随机获取5个元素,作为一个片断s返回,这样可以防止x=car时,列表l中还存在两个值
18     for i in s:  #i为主持人要打开的那扇门
19         y = i #y为主持人第一次打开的那扇门,露出门后的山羊
20     l = [1,2,3]    #列表l内的元素表示3个门
21     n = rd.randint(1,2)#参赛者是否更换选择:1.更换选择 2.不更换,相信自己的直觉
22     if n == 1:  #若参赛者更换选择
23         l.remove(x) #参赛者要求更换选择,所以不可能取到再在列表l中取到当初输入的那个数x
24         l.remove(y) #主持人已经打开了这扇门,所以也不可能再取到
25         for j in l: #j为参赛者更换选择后 他所选择的那扇门
26             if j == car:  #判断参赛者最终选择的门是否为车门
27                 count += 1 #参赛者更换选择后抽中汽车
28 p1 = count / times #参赛者更换选择后抽中汽车的概率
29 p2 = 1 - p1 #参赛者没有更换选择抽中汽车的概率
30 print("参赛者更换选择后抽中汽车的概率为{},没有更换选择直接抽中汽车的概率为{}".format(p1,p2))

啊呀呀,终于写完了,1点51啦 快2点啦,终于可以睡觉觉啦,虽然明天第一节就是体测,心疼我的室友,茶轴啪嗒啪嗒的敲击声。。。。

 

posted @ 2018-04-27 01:53  Glüklich_Junge  阅读(1207)  评论(2编辑  收藏  举报