在csdn上看到一篇关于车羊问题的文章(http://blog.csdn.net/naturebe/article/details/7272232),我编了个程序证明了结论,然后给出了一种简洁的数学证明。如下:
车羊问题(Car and Goats problem)又叫蒙提霍尔问题(Monty Hall Problem)或三门问题。这个问题来源于美国电视娱乐节目Let’s Make a Deal,问题的名字则来自该节目的主持人蒙提·霍尔(Monty Hall)。问题是这样的:参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门就可以赢得该汽车,而另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人会开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。明确的限制条件如下:参赛者会被问是否保持他的原来选择,还是转而选择剩下的那一道 那么换与不换,哪种策略答对的机率高呢?
思考了一下,感觉换的概率可能是1/3,1/2,2/3,无法确定,于是写个程序找到正确答案先:
程序证明
static Random random1 = new Random();
static Random random2 = new Random();
static Random random3 = new Random();
static int COUNT = 100000000;
public static void main(String[] args) {
//whether re-choise after prompt.
boolean retry = true;
int got = 0;
for (int i = 0; i < COUNT; i++) {
int[] data = generateData();
int c = Math.abs(random2.nextInt()) % 3;
if (retry) {
int p = prompt(data, c);
int choise = excluse(c, p);
got += data[choise];
} else {
got += data[c];
}
}
System.out.println("retry:" + retry + ",got car:" + got + ",count="
+ COUNT + ",probability=" + got * 1.0 / COUNT);
}
static int excluse(int c, int p) {
if (c + p == 1) {
return 2;
} else if (c + p == 2) {
return 1;
} else if (c + p == 3) {
return 0;
}
return -1;
}
static int prompt(int[] data, int c) {
int[] choise = new int[2];
int j = 0;
for (int i = 0; i < data.length; i++) {
if (i != c) {
if (data[i] == 1)// car
choise[j++] = -1;
else
choise[j++] = i;
}
}
if (choise[0] >= 0 && choise[1] >= 0) {// c is not car
return choise[Math.abs(random3.nextInt()) % 2];
} else if (choise[0] < 0) {
return choise[1];
} else {
return choise[0];
}
}
/**
* 1 for car,0 for goat
*/
static int[] generateData() {
int[] data = new int[3];
data[Math.abs(random1.nextInt()) % 3] = 1;
return data;
}
上面的程序,当把retry设成true和false,count设成1亿,得到的输出分别是:
// retry:true,got car:66671490,count=100000000,probability=0.6667149
// retry:false,got car:33331411,count=100000000,probability=0.33331411
从而从程序的角度证明:不换获得车的概率是1/3;换,获得车的概率是2/3.
数学证明
其实用逆推法很容易得出2/3的结论,仔细思考一下,就会发现:
参赛者换了门而且获得了车,
当且仅当参赛者第一次选择的门后面是羊。根据
等价事件的概率相等的数学原理,问题转换成参赛者第一此选择的门后是羊的概率,也就是2/3.
分享到:
相关推荐
实现文件拖放的一种简洁方法 介绍的这种方法只须调用一个WINDOWS API函数DragQueryFile即可实现文件的拖放操作,而且完全克服了上述3点不足。下面先介绍一下这个函数。DragQueryFile原型为:
我们构建了一个系统,为冯·诺依曼RISC体系结构上的程序执行提供简洁的非交互式零知识证明(zk SNARKs)。该系统由两部分组成:一个用于验证算术电路可满足性的密码验证系统,以及一个用于将程序执行转换为此类电路...
vb.net 一种简洁的数组元素随机排序方法
安全性是简洁非交互零知识证明的核心问题之一。这些协议的安全性可以通过不同的攻击模型来评估,例如,中间人攻击、重放攻击、选择平面攻击等。在实际应用中,需要根据不同的应用场景选择合适的攻击模型来评估协议的...
简洁大气喜庆红2015羊年剪纸ppt模板的诞生,正是对这种文化需求的一种响应。它将中国剪纸艺术与现代PPT设计巧妙融合,既保留了剪纸的原始韵味,又融入了简洁大气的设计理念。这一模板的推出,为那些希望在新年期间...
二手车购车协议简洁版.pdf
二手车购车协议简洁版.doc
在C/C++编程语言中,尤其是在处理字符串匹配问题时,简洁不仅仅是一种风格,更是一种高效解决问题的手段。传统的做法中,程序员可能会编写一个复杂的字符串遍历算法来查找符合特定模式的字符串,如电子邮件地址。...
养羊技术培训简洁PPT学习教案.pptx
摘要:阐述了SSO的基本原理,并设计了一个简洁SSO系统,解决了不同Web应用系统之间的互访问题:用户 登录一次即可访问所有Web系统。系统设计简单实用,不需要建设昂贵复杂的认证服务器,对现有系统的改动很 少,扩展...
这是一种简洁的法人代表身份证明书格式,内容包括法人代表的姓名、身份证号码、单位地址、联系方式等信息。该证明书通常由法人代表本人签字,并加盖单位公章。 篇四:法人身份证明书 这是一种法人身份证明书的格式...
再者,反证法是一种间接证明方法,它假设结论不成立,然后推导出与已知事实或逻辑矛盾的结果,从而证明原命题的正确性。这种方法特别适合处理否定性的命题或需要讨论多种可能情况的问题。例如,证明某个等式总是不...
其次,利用三角形面积证明的方法也是证明正弦定理的一种有效手段。具体来说,当已知三角形两边及其夹角时,可以构建垂直于第三边的高来计算三角形面积。通过三角形面积公式,结合边长和对应角的关系,可以推导出正弦...
在IT行业中,实习证明是大学生或求职者在完成实习经历后,由实习单位出具的一种官方文档,证实他们在实习期间的工作内容、表现及所积累的技能。这个名为“实习证明模板(两种格式).rar”的压缩包文件包含两个不同格式...
Ruby 是一种动态、面向对象的编程语言,具有简洁而灵活的语法。
**综合法**,又称演绎法,是一种自上而下式的证明方法。在使用综合法时,我们从已知的事实、定义、定理或公理出发,按照逻辑推理的规则,逐步推导出结论。这种证明方法的思维路径清晰,逻辑结构严谨,因而常用于数学...
QAP问题(Quadratic Arithmetic Programs)是对算术电路的NP问题的一种证明和验证机制。相比于QSP问题,QAP具有更好的普适性。在实际应用中,QAP被广泛用于隐藏数据的同时保持数学关系的完整性,例如通过加法同态...
1876年美国总统Garfield提出了另一种简洁的证明方法。他通过两个全等的直角三角形拼成一个直角梯形,并用一种独特的视角证明这个梯形的面积等于两直角边平方和。这不仅证明了勾股定理,也展示了其政治家之外的数学...
我们可以将系统的每一种状态视为一个节点,满足条件的节点间有一条路。这样问题就抽象为,在无向图中找一条路。我们可以使用图搜索算法来解决这个问题,例如 Breadth-First Search(BFS)或 Depth-First Search(DFS...