- UID
- 1244011
- 主题
- 3
- 阅读权限
- 60
- 帖子
- 4833
- 精华
- 3
- 积分
- 3417
- 金钱
- 6792
- 荣誉
- 40
- 人气
- 2
- 在线时间
- 511 小时
- 评议
- 0
- 帖子
- 4833
- 精华
- 3
- 积分
- 3417
- 金钱
- 6792
- 荣誉
- 40
- 人气
- 2
- 评议
- 0
|
本帖最后由 YXWScan 于 2011-8-10 12:06 编辑
同志们,我承诺这是最后一次用三门来恶心你们了...
三门问题又叫蒙特霍问题(Monty Hall problem):
参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门就可以赢得该汽车,而另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人会开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门,或者说:换另一扇门会否增加参赛者赢得汽车的概率?
刚看到这题目的时候,人们凭常识会说答案是不必换门,因为剩下两扇门赢得汽车的概率都是1/2,不少人更会说对这种简单的概率题都还纠缠不清简直白上中学了之类,因而不屑于和认为换门胜率是2/3的人进一步讨论,认为后者是昏了头。
但是就各方面资料显示的蒙特霍问题的结论来说,2/3是正确答案。
先来谈1/2:
我们知道,最初参赛者选择门后,门后是车的概率是1/3,而主持人在剩下的门中随机开门,开到是车的几率也是1/3,这里的问题是,如果在节目中,主持人开门遇到是车,之后节目会怎么进行呢?答案是,当天的节目终止,参赛者不可能获胜了。因此,讨论的问题是:在成功的节目中,即主持人没有选中车的节目中,参赛者换门后获胜的概率。
情况很简单了,我们假设概率能够真实的均匀分布,连续做3天的节目的话,其中有1天车在参赛者最初选择的门后面,有1天车在主持人从剩下两扇门中随机打开的那扇门后,剩下1天车在让参赛者考虑要换的门后面。因为3天节目中有一天节目因为主持人开门遇到车而结束,剩下2天里,有1天车在参赛者最初选择的门后,故换门不能提高胜率,两扇门胜率都是1/2。
一个很简单的概率问题,描述得那么多,是不是在故意把问题搞复杂呢?我写这么多,是想强调一个事实,是即使最后承认2/3是最终解的情况下也不能否认的事实:参赛者最初选择的门有1/3的胜率,主持人事件的确能将最初的门的胜率提高到1/2!
因为总有人要程序说事,这里是C++代码:
#include <ctime>
#include <iostream>
enum DoorItem { DT_Sheep, DT_Car, };
int main()
{
int winGameCnt = 0; // 不换门赢得节目的次数
int succGameCnt = 0; // 成功举办节目的次数
const int MAX_GAME_CNT = 100000; // 举办节目的次数
DoorItem doors[3]; // 三扇门
srand((unsigned)time(NULL)); // 初始化随机发生器
for (int i = 0; i < MAX_GAME_CNT; ++i)
{
// 随机放置车
doors[0] = doors[1] = doors[2] = DT_Sheep;
doors[rand() % 3] = DT_Car;
// 因为参赛者最初选门的时候,各门无区别,我们让参赛者总是选
// 第1门,因此主持人总在后两门中随机
if (doors[rand() % 2 + 1] == DT_Car) continue; // 主持人选到车,失败的节目
++succGameCnt; // 成功的节目
if (doors[0] == DT_Car) ++winGameCnt; // 不换门赢得节目
}
std::cout
<< "不换门赢得节目的次数:"
<< (float)winGameCnt / succGameCnt;
}
再说2/3的情况,这是1/2的坚持者很难接受的:
节目一开始,主持人和参赛者的初选会开到车的概率各是1/3,问题是,如果主持人开到车的话,除了判定这是一次失败的节目外,更可能的节目运行流程是怎样的呢?考虑到其他各种商业因素,节目不会中断,主持人会抵赖,主持人会重新选择一扇没车的门,或者说,主持人在节目一开始就知道车在哪一扇门后,部分三门问题的描述中甚至直接强调了规则:主持人打开的门一定是羊!
我们还是模拟3天节目,1天车在参赛者最初的门后,1天车在要求参赛者考虑要换的门后,1天车在主持人选择的门后。等等,这里主持人要作弊,按概率分配下来,主持人最初想要打开的门后是车时,主持人会选择打开两扇门中的另外一扇,因此第3天如果参赛者换门的话,要换的门就是主持人刚刚已经确认有车的门!结果就是第1天车在参赛者最初的门后,第2、3天车都在主持人没选的门后(尽管第3天主持人为避免中断节目一度换过门)。因此换门的胜率是2/3!这2/3是由1/3的偶然加上主持人偷偷换选带来的1/3的必然组成的!
如果进行大量重复试验,在1/2结论的规则下,有1/3的试验会被剔除,而在2/3结论的规则下,任何试验都不回被剔除。前一种情况不换门的胜率是1/2 = (1/3 ) / (2/3),总的试验量下降了;后一种情况不换门的胜率1/3 = (1/3) / (1),总的试验量被人为保持住了。
将1/2的C++代码稍作修改得到2/3的代码:
#include <ctime>
#include <iostream>
enum DoorItem { DT_Sheep, DT_Car, };
int main()
{
int winGameCnt = 0; // 换门赢得节目的次数
const int MAX_GAME_CNT = 100000; // 举办节目的次数
DoorItem doors[3]; // 三扇门
srand((unsigned)time(NULL)); // 初始化随机发生器
for (int i = 0; i < MAX_GAME_CNT; ++i)
{
// 随机放置车
doors[0] = doors[1] = doors[2] = DT_Sheep;
doors[rand() % 3] = DT_Car;
// 因为参赛者最初选门的时候,各门无区别,我们让参赛者总是选
// 第1门,因此主持人总在后两门中随机
int hostChoice = rand() % 2 + 1; // 主持人最初的选择
// 主持人的选择只能是1或者2,因此换门就是3-hostChoice
if (doors[hostChoice] == DT_Car) hostChoice = 3 - hostChoice; // 主持人换选,避免中断节目
// 这里我统计参赛者换门赢得节目,让主持人看起来做了点事的样子...
// 其实如果统计不换门,就会发现主持人就只在瞎折腾
if (doors[3 - hostChoice] == DT_Car) ++winGameCnt; // 参赛者换门赢得节目
}
std::cout
<< "不换门赢得节目的次数:"
<< (1 - (float)winGameCnt / MAX_GAME_CNT);
}
如果认为主持人开到羊只是偶然下的一个即成的事实,本次节目情况只是大量随机事件中的一个普通样本的话,那就不必换门;但如果相信主持人开到羊是必然,节目有特殊的规则的话,换门就有高达2/3的获胜率。无论主持人开门的结果是由以上那种假设导致的,至少换门的胜率不会低于50%。
其实1/2就是纯粹的数学结论,自然规律,而2/3则是人事,是社会,是现实因素。既然三门问题是现实问题,那如果你要作为参赛者,最好就去遵循组织方制定的规则,换门。
|
|