羊车门问题分析
题目描述:有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点啦,终于可以睡觉觉啦,虽然明天第一节就是体测,心疼我的室友,茶轴啪嗒啪嗒的敲击声。。。。