用C++验证三门问题

三门问题(换门):

#include <iostream>

#include <cstdlib>

#include <ctime>

#define random(a,b) (rand() % (b-a+1))+ a

using namespace std;

 

int main()

{

    srand((int)time(0));

    int doors[3];     

    int mode;

    int choose;

    int result; 

    int success = 0;

    for(int i = 0;i < 10000;++i) {//模拟一万次

        mode = random(1,3);//3门问题的排列组合总共有三种情况

        if(mode == 1) {//模式一是前两个门是羊,后一个门是汽车

            doors[0] = 1;

            doors[1] = 1;

            doors[2] = 2;

            choose = random(0,2);//玩家随机选择其中一个门

            if(choose == 0) {//根据规则得到结果

                result = 2;

            }

            else if(choose == 1) {

                result = 2;

            }

            else {

                result = 0;

            }

            if(doors[result] == 2) {//判断门后是否为汽车,如果为汽车,则统计量加1

                ++success;

            }

        }

        else if(mode == 2) {//模式二为车、羊、羊

            doors[0] = 2;

            doors[1] = 1;

            doors[2] = 1;

            choose = random(0,2);

            if(choose == 0) {

                result = 1;

            }

            else if(choose == 1) {

                result = 0;

            }

            else {

                result = 0;

            }

            if(doors[result] == 2) {

                ++success;

            }

        }

        else {//模式三为羊、车、羊

            doors[0] = 1;

            doors[1] = 2;

            doors[2] = 1;

            choose = random(0,2);

            if(choose == 0) {

                result = 1;

            }

            else if(choose == 1) {

                result = 0;

            }

            else {

                result = 1;

            }

            if(doors[result] == 2) {

                ++success;

            }

        }

    }

   

    cout << success << endl;//输出成功的总数

    return 0;

}

 

三门问题(不换门):

#include <iostream>

#include <cstdlib>

#include <ctime>

#define random(a,b) (rand() % (b-a+1))+ a

using namespace std;

void game(int &success);//模拟做出选择后不更改的函数

int doors[3];

int main()

{

    srand((int)time(0));

    int mode;

    int choose;

    int result;

    int success = 0;

    for(int i = 0;i < 10000;++i) {//实验一万次

        mode = random(1,3);//3门问题的排列组合总共有三种情况

        if(mode == 1) {//模式一是前两个门是羊,后一个门是汽车

            doors[0] = 1;

            doors[1] = 1;

            doors[2] = 2;

            game(success);

        }

        else if(mode == 2) {//模式二为车、羊、羊

            doors[0] = 2;

            doors[1] = 1;

            doors[2] = 1;

            game(success);

        }

        else {//模式三为羊、车、羊

            doors[0] = 1;

            doors[1] = 2;

            doors[2] = 1;

            game(success);

        }

    }

   

    cout << success << endl;//输出成功的总数

    return 0;

}

void game(int &success) {

    int result;

    result = random(0,2);//随机选择一扇门

    if(doors[result] == 2) {//如果选对了,统计量+1

        ++success;

    }

}

结果:

换门后成功拿到汽车的频率10组数据如下,都接近三分之二(0.6666)

0.6692
0.6717
0.6697
0.669
0.6616
0.6712
0.6663
0.6693
0.6656
0.6686

不换门成功拿到汽车的频率10组数据如下,都接近三分之一(0.3333)

0.3409
0.3325
0.3399
0.3388
0.3354
0.3289
0.3337
0.3337
0.3343
0.3342

由此可见,三门问题的结论是正确的。

posted on 2020-05-21 11:08  飞凤颖悟绝伦  阅读(680)  评论(0编辑  收藏  举报

导航