您的位置:首页 > 其它

Monty Hall问题 模拟

2012-10-31 14:47 387 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: