原文来自《读者》第135期
前不久在美国《检阅》杂志的“玛丽莲”专栏上介绍的一道游戏性质的数学题,在美国引起了轰动,大约有1000所大中小学,从二年级的小学生到研究生都卷入了争解这个题目的讨论。有趣的是,在给该专栏主持人玛丽莲小姐的10000多封来信中,有约1000封是具有博士头衔的读者写的,他们说,玛丽莲小姐的答案是错的,而事实上,错的恰恰是博士们。
玛丽莲小姐的题目是这样的:有三扇可供选择的门,其中一扇后面是辆汽车,另两扇的后面都是一头山羊。你当然想选中汽车。主持人先让你随意挑选。比如你选了1号门,这时主持人打开的是后面有羊的一扇门(比如它是3号门),现在主持人问你“为了有较大的机会选中汽车,你是坚持你原来的选择、还是愿意换选另一扇门”
玛丽莲小姐公布的答案是:“应该换选另一扇门。”——这是说:她给你看3号门后面是羊之后,你原来选1号门的,应换选为2号门;你原来选2号门的,应换选1号门。
通常的想法是,主持人既然把没有车的那扇门打开了,剩下的两扇门后面是车是羊的可能性各占一半,坚持原来的选择也好,换选也好,选中车的机会都是二分之一。
博士们就是这样想的,你认为究竟谁对呢?
引用《读者》的部分到此结束
让我们用R代码实现这段过程 :
============================================================================
gates<-c("goat","car","goat") # 三个门,顺序无所谓,你可以随便改
gates.number<-c(1,2,3) #三个门的编号,也可以随便改
times<-1000 #模拟1000次,次数越多越好
get.if.change<-0
get.if.not.change<-0
for ( i in 1:times)
{
choice<-sample(gates.number,size=1) #参与者选择一个门
open.gate<-gates.number[gates[gates.number]=="goat"&gates.number!=choice]
if(length(open.gate)>1 ) { open.gate<-sample(open.gate,1)} #主持人打开一个门,里面是羊
left.gate<-setdiff(gates.number,c(choice,open.gate))#最后剩下的那个门
if (gates[choice] == "car") {get.if.not.change = get.if.not.change + 1} #如果不换门,而且得到车的次数
if (gates[left.gate] == "car") {get.if.change = get.if.change + 1 } #如果换门,得到车的次数
}
change.result<-get.if.change/times
not.change.result<-get.if.not.change/times
change.result
not.change.result
times
============================================================================================
怎么样,change.result总是在2/3徘徊,而not.change.result则是1/3吧?
那么模拟的结果告诉我们:还是更换你的选择比较好。
可是,博士们到底错在哪里了呢?我给一点小提示:注意原文中这句话
:“这时主持人打开的是后面有羊的一扇门……”也就是说,主持人是知道哪里有车,哪里有羊的,所以……再想想:如果主持人事先不知道车再哪扇门,可能发生什么情况……
贝叶斯全概率公式,啊哈?
调用函数的说明:
sample(x,n): 从x中随机抽取n个样本; 注意:如果x是一个单独的数,那么返回值是1到x随机抽取n个数,这就是为什么open.gate变量的选择要用两行代码。
setdiff(x,y): 从x,y两个集合中抽取x有,而y没有的部分,也就是 x-x∩y
具体的细节请参见R的自带帮助。
=============================================================================================
多说一句:
头衔是狗屎。
https://blog.sciencenet.cn/blog-80197-221834.html
上一篇:
轻松一笑:商标委如何解释Starcraft 和 Ghost下一篇:
翻译练习--音乐剧经典:《棋王》之《颂歌》