• 羊车门问题


    羊车门问题分析

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

     

  • 相关阅读:
    BSGS模板(互质与不互质) 洛谷P4195、P3846
    整除分块(数论分块)
    洛谷P3327 [SDOI2015]约数个数和——莫比乌斯反演
    模块二
    模块
    二分法 匿名函数
    3.26作业
    函数的递归调用
    yield表达式 三元表达式
    3.25作业
  • 原文地址:https://www.cnblogs.com/m17773572025/p/8956680.html
Copyright © 2020-2023  润新知