先感谢一下大家对这个帖子支持 先来几个简单觧释方法 1、其实可以枚举一下所有的情况,例如:有a,b,c 3扇门,a后面是车。 那么: 1.选a,那么主持人打开b。改:没车;不改:有 2.选a,那么主持人打开c。改:没车;不改:有 3.选b,那么主持人打开c。改:有车;不改:没车 4.选c,那么主持人打开b。改:有车;不改:没车 www.ddhw.com
总结: 你选了a,那么,改:没车,不改:有 选了b,c,那么,改:有,不改:没车 你已开始选的是a的概率是1/3,bc概率是2/3,所以换好 -------------------------------------------------------------------------------------------- 2、如果一开始选中答案 不改 换 不换 选中 1/3 0 1 没选中 2/3 1 0 www.ddhw.com
所以 换-> 0 * 1/3 + 1 * 2/3 =2/3 不换-> 1 * 1/3 + 0 * 2/3 =1/3 所以 换好 ----------------------------------------------------------------------------------------------- 3、方案1 step1: 选中车概率1/3 step2: 不变,故保持概率1/3 所以方案1 得到车的总概率 = 1/3
方案2: 情况A:step1选中车概率1/3,则step2得到车概率0,所以此概率为1/3 * 0 = 0 情况B:step1选中羊概率2/3,则step2得到车概率1,所以此概率为2/3 * 1 = 2/3 www.ddhw.com
所以方案2 得到车的总概率 = (1/3 * 0)+(2/3 * 1) = 2/3 换好 -------------------------------------------------------------------------------------------------4、 最开始的概率分布: a b c 1/3 1/3 1/3 你选了a,主持人排除了c.留下b. 主持人参与后的概率分布: a b c 1/3 2/3 0 现在你选b,就捡了个大便宜哦!所以当然要换。 www.ddhw.com
主持人帮你排除了一个错误的选择,于是你所获得的有用信息 增大了。 这就是关键! ------------------------------------------------------------------------------------------------www.ddhw.com 最后试用计算机模拟了这个过程,来计算每种选择的成功的概率。下面是采用C++编写的模拟程序: #i nclude www.ddhw.com #i nclude www.ddhw.com #i nclude #i nclude www.ddhw.com #i nclude www.ddhw.com www.ddhw.com using namespace std; www.ddhw.com bool changeSucc( int sam1, int sam2, int sam3 );www.ddhw.com int checkCar( const vector<int> &vecDoor );www.ddhw.com www.ddhw.com void main {www.ddhw.com int cntExperiment; // 试验次试www.ddhw.com cout << "Input the count of samples: "; cin >> cntExperiment;www.ddhw.com www.ddhw.com // 产生3*cntExperiment个随机数www.ddhw.com vector<int> vecSam;www.ddhw.com srand( time(0) ); for ( int i = 0; i < cntExperiment*3; i++ )www.ddhw.com {www.ddhw.com if ( i%3 == 0 ) cout << endl;www.ddhw.com float num = rand;www.ddhw.com vecSam.push_back( num );www.ddhw.com www.ddhw.com cout << num << " "; }www.ddhw.com www.ddhw.com int cntChangeSucc = 0; // 换门之后成功的次数www.ddhw.com int cntChangeFals = 0; // 换门之后失败的次数 www.ddhw.com // 进行cntExperiment次试验,每次取得3个随机数(代表三个门)www.ddhw.com // 统计考生第二次换门之后能成功取得轿车的概率www.ddhw.com for ( int i = 0; i < vecSam.size; i = i + 3 ) {www.ddhw.com if ( changeSucc( vecSam, vecSam[i+1], vecSam[i+2] ) == true )www.ddhw.com {www.ddhw.com cntChangeSucc++;www.ddhw.com } elsewww.ddhw.com {www.ddhw.com cntChangeFals++; }www.ddhw.com }www.ddhw.com cout << "cntChangeSucc = " << cntChangeSucc << endl; cout << "cntChangeFals = " << cntChangeFals << endl;www.ddhw.com www.ddhw.com cout << "change success prob: " << (float)cntChangeSucc / cntExperiment << endl; }www.ddhw.com www.ddhw.com // 用三个随机数表示三个门,sam1,sam2, sam3中最大的数表示门后是轿车www.ddhw.com // 假设考生第一次选择了第0号扇门,这里没有采用随机选择的方法www.ddhw.com bool changeSucc( int sam1, int sam2, int sam3 ) www.ddhw.com { vector<int> vecDoor;www.ddhw.com vecDoor.push_back( sam1 );www.ddhw.com vecDoor.push_back( sam2 ); vecDoor.push_back( sam3 );www.ddhw.com www.ddhw.com int car = checkCar( vecDoor ); // 轿车的代表门号www.ddhw.com www.ddhw.com // 由于考生选择了第0号门,现在主持人去掉剩下两个门中的一个www.ddhw.com // 这里采用去掉剩下两个数中较小的数,以保证不要去掉轿车www.ddhw.com int change; // 考生选择change时,选择的另外一个门号www.ddhw.com if ( vecDoor[1] < vecDoor[2] )www.ddhw.com { change = 2;www.ddhw.com } elsewww.ddhw.com {www.ddhw.com change = 1; }www.ddhw.com www.ddhw.com // 判断如果change,是否取得轿车www.ddhw.com if ( change == car )www.ddhw.com { return true;www.ddhw.com }www.ddhw.com else {www.ddhw.com return false; }www.ddhw.com }www.ddhw.com www.ddhw.com // 检查哪个门后是轿车,这里用最大的数代表轿车www.ddhw.com int checkCar( const vector<int> &vecDoor ) {www.ddhw.com int max = 0; for ( int i = 0; i < vecDoor.size; i++ )www.ddhw.com {www.ddhw.com if ( vecDoor > vecDoor[max] )www.ddhw.com { max = i;www.ddhw.com }www.ddhw.com } www.ddhw.com return max;www.ddhw.com } 经运行之后,第二次换门之后成功获得轿车的概率为2/3。要换 www.ddhw.com
|