三门问题的三种解法

13 篇文章 0 订阅
3 篇文章 0 订阅

今天来讲一个经典的概率论问题:

介绍

什么是三门问题

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。 问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。 参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。

(来源于知乎)

故事情节

参赛者选中了一个门。这时,主持人Monty Hall打开了另一扇门,让参赛者看。只见里面有一只山羊在安静的吃艹。然后,主持人Monty Hall问参赛者:“你也看到了,这扇门里是山羊,那么我给你一次机会,你可以换成另一扇门,你换不换?”

换还是不换

按这样来看,剩下两扇门,应该有一只羊一辆车,这样来看,两扇门有车的概率应该是一样的,都是 50 % 50\% 50%,也就是说,换或者不换的概率也都是 50 % 50\% 50%

然而。。。

令人疑惑不解的答案

当时大数学家给出的答案是:换的概率是 2 3 \huge \color{red}\frac{2}{3} 32,不换的概率是 1 3 \huge \color{red}\frac{1}{3} 31

很神奇,对吧。

那么,我们来验证一下这个答案对不对。

数学方法:概率论

思路很简单,假设一开始选的时候把另外两扇门绑一起,称为2号门,而一开始选的是1号门。

而在主持人告诉你那扇门是羊的时候,我们就知道,2号门可能是一车一羊,也有可能是俩羊。

  1. 一车一羊
    1. 左边(绑一起之前)的门是车(1/3)
    2. 右边的门是车(1/3)
  2. 二羊(全是羊)(1/3)

所以肯定是换更好

编程:生成数据

我们可以随机生成很多组数据,然后统计概率。

c++代码:

#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
bool door[5];//下标1~3表示门,true是车,false是羊
int huan,buhuan;//记录成功次数
int main()
{
	srand(time(NULL));//有一些编译器是srand(time(0));
	for(int i = 1; i <= 10000; i++){//测试一万次
		int p=rand()%3+1;//生成一辆车
		door[p]=true;
		int choose=rand()%3+1;//随机选择一扇门
		int GB=rand()%3+1;//公布的那扇门
		while(GB==p||GB==choose)//不能是有车的或选过的
		{
			GB=rand()%3+1;//重新生成
		}
		if(door[choose]==true)huan++;//记录次数
		else buhuan++;
	}
	cout << huan << " " << buhuan << " " << 1.0*huan/(huan+buhuan)*100 << "%";//输出次数以及概率
}

编程:枚举法

直接枚举出所有情况,再按次数求出概率。


#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
bool door[5];//下标1~3表示门,true是车,false是羊
int huan,buhuan;//记录成功次数
int main()
{
	for(int i = 1; i <= 3; i++){//车在哪个门
		for(int j = 1; j <= 3; j++){//选哪个门
			for(int k = 1; k <= 3; k++){//公布哪个门
				if(k==i||k==j)continue;//不能选有车的和参赛者选的
				if(i==j)huan++;//记录次数
				else buhuan++;
			}
		}
	}
	cout << huan << " " << buhuan << " " << 1.0*huan/(huan+buhuan)*100 << "%";//输出次数以及概率
}

好的那么本期就结束了,我们下期再见!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值