数据科学与R语言

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

2018-08-28  本文已影响0人  fa3a76157bc7

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、结论

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

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

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


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

上一篇下一篇

猜你喜欢

热点阅读