Monty Hall问题
Weki:蒙提霍尔问题,亦称为蒙特霍问题或三门问题(英文:Monty Hall problem),是一个源自博弈论的数学游戏问题,大致出自美国的电视游戏节目Let's Make a Deal。问题的名字来自该节目的主持人蒙提·霍尔(Monty Hall)。
这个游戏的玩法是:参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门就可以赢得该汽车,而另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人会开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?如果严格按照上述的条件的话,答案是会—换门的话,赢得汽车的机会率是2/3。
//上午web课的时候,用c++写了个模拟程序,仅供参考。 2012年10月31日
#include<iostream>#include<ctime>
using namespace std;
#define Len 3 //Len,门数,可以改变(此函数中)
char change; //是否改变决定,一些函数的定义用到。
//
void init(bool *door) //初始化
{
int k = rand()%Len;
for(int i=0; i<Len; i++)
{
if(i == k) door[i] = true; //true放车,false放羊
else door[i] = false;
}
}
int choose() //观众选择
{
int k =rand()%Len;
return k;
}
int open(bool *door, int k) //主持人打开门(羊)
{
do{
int m = rand()%Len;
if((m!=k)&&(door[m]==false)) //门m后是羊&&不是用户的选择
return m;
else continue;
}while(true);
}
int rechoose(bool *door, int k, int n) //再次选择:放置情况为数组door,观众选择k,主持人选择n(此次door并不起作用,暂且放置)
{
if((change = 'Y')||(change = 'y'))
{
do{
int m = rand()%Len;
if((m!=k)&&(m!=n)) return m;
else continue;
}while(true);
}
else return k;
}
bool getresult(bool *door, int k) //判断结果
{
if(door[k] ==true) return true;
else return false;
}
//
int main()
{
bool door[Len];
int count=0; //选中数目,计数。以计算概率
int sum;
cout<<"input play numbers:";
cin>>sum;
cout<<"about to change idea?\t不变输入y,改变输入其他任意字符:\n";
cin>>change;
srand(time(0)); //设置种子
//
for(int i=0; i<sum; i++)
{
init(door);
int k =choose(); //观众选择
int L=open(door, k); //主持人打开
int m = rechoose(door, k, L); //观众再次选
if(getresult(door,m)==true) //查看结果
{
count++;
cout<<"第"<<i+1<<"次选中,汽车位于"<<m<<"号门."<<endl;
}
else cout<<"第"<<i+1<<"次未选中."<<endl;
}
//
cout<<"选中的概率:"<<double(count)/sum<<endl;
return 0;
}
可能你会对结果有些疑问,更详细的解释这里有,借鉴一下,http://www.matrix67.com/blog/archives/73