美文网首页数据科学与R语言
【R语言】求解“三门问题”

【R语言】求解“三门问题”

作者: fa3a76157bc7 | 来源:发表于2018-08-28 15:48 被阅读0次

    1、什么是三门问题

    三门问题(Monty Hall problem) 是一个关于概率的谜题。起源于一个电视节目 Let's Make a Deal。这个问题最开始是由Steve Selvin在1975年的一封信里提出并解决。
    假设在一个游戏节目中,你可以选择三扇门:一扇门后面是一辆车,另两扇门后面是山羊。在你选择一扇门后,知道门后内容的主持人打开另一扇门,门后是山羊。然后他对你说:“你想更换选择吗吗?”改变选择对你有利吗?
    ------节选自维基百科

    2、用R语言求解

    关于三门问题的分析讲解网络上多如牛毛,也有直接应用Python模拟过程求近似解的,但应用R语言重采样的还很少,正好尝试一下。

    需要用到的函数

    sample():用于随机实验取样
    replicate():重复实验
    mean():求概率
    as.character():转换到字符串格式


    2.1 计算坚持选择的概率

    B <- 50000      #实验重复次数,越大越精确
    stick <- replicate(B, {
      doors <- as.character(1:3)   #问题中的三门
      prize <- sample(c("car","goat","goat"))  
      car_door <- doors[prize == "car"]   #门后是车
      my_pick  <- sample(doors, 1)   #选择三门中的一扇
      show <- sample(doors[!doors %in% c(my_pick, car_door)],1)      #主持人展示
      stick <- my_pick     #坚持选择
      stick == car_door   # 坚持选择是车
    })
    mean(stick)   #求平均概率
    [1] 0.33772    #结果约为三分之一
    

    2.2 计算改变选择的概率

    和上面的计算是一套逻辑,只是更改后的选择是另外两门中的其中之一。

    B <- 50000
    switch <- replicate(B, {
      doors <- as.character(1:3)
      prize <- sample(c("car","goat","goat"))
      car_door <- doors[prize == "car"]
      my_pick  <- sample(doors, 1)
      show <- sample(doors[!doors %in% c(my_pick, car_door)], 1)
      stick <- my_pick
      switch <- doors[!doors%in%c(my_pick, show)]
      switch == car_door
    })
    mean(switch)
    [1] 0.66546
    

    3、结论

    通过代码能够直观发现改变选择后,拿到车的概率是不改变的一半。
    事实上这是一个很严谨的概率问题,各类概率论教材基本都看得到有很严谨的解释。如果大家有兴趣可以翻翻知乎下关于这个问题的解答哦~
    蒙提霍尔问题(又称三门问题、山羊汽车问题)的正解是什么?

    贴一个我觉得最最简单的回答:

    第一次选只能选一个门,有三分之一的胜算,如果允许一次选两个门,就有三分之二的胜算,主持人搞一搞,你换一换,等同于一开始就让你选了两个门。
    --------知友 沐雨栉风


    心得:碰见一个问题,应用工具和现有知识去解决,对其中的反常识之处尽心琢磨,研究背后严谨的原理,最终用简洁的语言表达出来——这大概就是我一直努力的目标了。

    相关文章

      网友评论

        本文标题:【R语言】求解“三门问题”

        本文链接:https://www.haomeiwen.com/subject/ulltwftx.html