在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.
分享到:
相关推荐
我们构建了一个系统,为冯·诺依曼RISC体系结构上的程序执行提供简洁的非交互式零知识证明(zk SNARKs)。该系统由两部分组成:一个用于验证算术电路可满足性的密码验证系统,以及一个用于将程序执行转换为此类电路...
标题中提到的“欧拉公式的另一种证明途径”指的是一种不同的方法来证明欧拉公式。欧拉公式是复分析中的一个重要公式,它表达了复指数函数和三角函数之间的关系,即对于任意实数x有: \[ e^{ix} = \cos(x) + i\sin(x...
vb.net 一种简洁的数组元素随机排序方法
"一种车辆定位器的制作方法" 本技术涉及停车场用装置技术领域,尤其是涉及一种车辆定位器。车辆定位器是停车场或车库中用于限制每辆汽车停车的位置,避免不规范地停车铺张停车空间或挤占行车通道的重要设备。但是,...
二手车购车协议简洁版.pdf
在C/C++编程语言中,尤其是在处理字符串匹配问题时,简洁不仅仅是一种风格,更是一种高效解决问题的手段。传统的做法中,程序员可能会编写一个复杂的字符串遍历算法来查找符合特定模式的字符串,如电子邮件地址。...
养羊技术培训简洁PPT学习教案.pptx
高效简洁的一种图像分割方法,分割效果好,执行速度快,是最新的全自动分割方法
Ruby 是一种动态、面向对象的编程语言,具有简洁而灵活的语法。
QAP问题(Quadratic Arithmetic Programs)是对算术电路的NP问题的一种证明和验证机制。相比于QSP问题,QAP具有更好的普适性。在实际应用中,QAP被广泛用于隐藏数据的同时保持数学关系的完整性,例如通过加法同态...
二手车购买合同简洁样本.doc
【标签】"python" 指出这款游戏的开发语言是Python,这是一种高级通用型编程语言,以其简洁明了的语法和丰富的库资源受到程序员的广泛喜爱。Python适合初学者入门,也适用于开发各种类型的应用程序,包括桌面应用、...
在建筑行业中,工作证明是一种非常重要的文档,它用于证实个人在特定时间段内在某公司或机构工作的事实。这个模板提供了一个通用格式,可以帮助个人或企业快速出具工作证明。以下是该工作证明模板涉及的关键知识点:...
零知识证明是一种协议,其中包含两个参与者:证明者和验证者。证明者的目标是让验证者相信某个断言是正确的,而验证者希望确保证明者确实拥有某种秘密信息或能力,但同时不会从证明过程中获得任何关于这个秘密的有用...
灰色简洁干净二手汽车商城网站模板_灰色 黑色 简洁 干净 二手车 车 汽车 商城 网店 菜单 幻灯 标准 企业 整站 html 漂亮 精品.rar
贪心法,一种在计算机科学和数学中广泛应用的策略,其核心理念在于在解决问题时,通过每一步选择局部最优解,期望最终达到全局最优。贪心法以其简洁高效的特点,在数据结构与算法中占据了重要地位,如在最小生成树的...
1. **综合法**:这是一种由因导果的证明策略,从已知条件出发,依据定义、定理、公理逐步推导,直至得出结论。 2. **分析法**:又称执果索因,从需要证明的结论入手,反向推理寻找使结论成立的必要条件,然后继续...
**综合法**是一种由因导果的证明方法,它从已知条件(P)出发,通过一系列的逻辑推理,逐步推导至所要证明的结论(Q)。综合法的特点在于,每一步都寻找的是证明结论所需要的必要条件,最终形成一个完整的推理链条,...
MUI精美简洁后台管理系统是一款基于MUI框架开发的高效、易用的后台管理解决方案。MUI以其独特的设计风格和强大的功能特性,深受开发者和用户喜爱,尤其适合构建直观且高效的后台界面。在这款系统中,MUI的优秀特性...