星期六, 十一月 17, 2012

三门问题的模拟


有一个著名的蒙提霍尔问题,亦称为三门问题(英文:Monty Hall problem),大致出自美国的电视游戏节目Let's Make a Deal。问题的名字来自该节目的主持人蒙提·霍尔(Monty Hall)。这个游戏的玩法是:参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门就可以赢得该汽车,而另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,知道门后情形的节目主持人会开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?

这条问题亦被叫做蒙提霍尔悖论:虽然该问题的答案在逻辑上并不自相矛盾,但十分违反直觉。这问题曾引起网络上一阵热烈的讨论。有人认为概率还是1/3,不用换。有人认为概率增大为1/2,可以换。实际上,如果严格按照上述的条件的话,赢得汽车的正确机率是2/3。我们可以用一种极端的方法来考虑,如果有100扇门,主持人打开了998扇空门,你换不换呢?显然是要换的。

还有许多概率推理的方法可以获得正确答案。但我们有计算机和R,让我们来写个小程序模拟一下嘛。

# 坚持不换的策略
n <- 0
for ( i in 1:10000) {
    door <- c(1,2,3)
    chance <- sample(door,1)
    select <- sample(door,1)
    if (chance == select) {
        n <- n + 1
    }
}
print(n/10000)
 
# 坚持换的策略
n <- 0
door <- c(1,2,3)
for ( i in 1:10000) {
    chance <- sample(door,1)
    select <- sample(door,1)
    remove <- ifelse(chance==select, 
                    sample(setdiff(door,chance),1),
                    setdiff(door,c(chance,select)))
    reselect <- setdiff(door,c(select,remove))
    if (chance == reselect) {
        n <- n + 1
    }
}
print(n/10000)
模拟结果分别是0.33和0.66,与理论结果一致。一个很简单的模拟,证明了一个略有麻烦的问题。

参考资料:
wikipedia
Data_Analysis_with_Open_Source_Tools

9 条评论:

  1. 关于这个问题,结论和模拟都没有疑问,只是“我们可以用一种极端的方法来考虑,如果有100扇门,主持人打开了998扇空门,你换不换呢?显然是要换的。”一直不赞同使用这个所谓“极端”的方法进行类比。

    原因在于如果要说极端,为什么100扇门的时候主持人要打开998扇?主持人打开998扇的前提是假设规则是”留下两扇门不开“,但原题中并没有明确这一点,只说是打开其中一扇。所以,如果是100扇门,主持人打开一扇,还留999扇,换还是不换,仍然是个问题。

    回复删除
  2. 请教一个问题,是否能用R写个程序解决?

    同时掷两个骰子(六面),问两个骰子都是质数的几率是多少?

    谢谢

    回复删除
    回复
    1. 质数就是1、3、5嘛

      m <- 10000
      s1 <- sample(1:6,m,replace=T)
      s2 <- sample(1:6,m,replace=T)
      n <- ifelse(s1 %% 2 !=0 & s2 %% 2 != 0, 1, 0)
      mean(n)

      大约是0.24左右

      删除
    2. 老大能解释一下吗?ifelse中的都不被2整除就可以了?2,3,5是质数,其中2可以被整除啊。还是您把1和2互换了,反正出现的概率是一样的?

      删除
    3. 对质数的定义失误了,你的说法是对的,程序结果也是对的。

      删除
  3. 顺便问博主一个问题:一个3L和一个5L的水桶,需要称量出4L的水,可以用R来做吗?
    如果在不确定正确答案之前,这个可以用计算机语言来解决吗?

    回复删除
  4. 贪婪算法应该可以得到结果

    回复删除