自学内容网 自学内容网

(C++)三门问题,模拟验证换门与不换门获胜概率

刷视频经常刷到三门问题,总是说在概率的计算下换门获胜的概率更高,但这也是停留在理论层面的。我想着做一个程序模拟一下三门问题,整体思路就是

1.先用随机数确定哪一扇门后面有奖品,生成的随机数对三取余数,保存结果到变量car中

2.使用随机数模拟玩家随机选择一扇门,同样是对3取余数,结果保存在palyerChoice

3.打开一扇没有奖品的门,做一个逻辑判断,一共就三扇门,如果没被玩家选且里面没有奖品,打开这扇门就行了。

4.然后让玩家换门,操作就是让变量switchChoice赋值为,既不是奖品所在的门且不是之前选择的门playerChoice就行了。

5.分别用stayWin和switchWin来记录没换门获胜和换门获胜,对比playerChoice和switchChoice与car是否相等,然后对应的变量++就行了。

然后以上五个步骤处于一个循环中,循环次数为TRIALS(定义的一个全局变量),更改这个值可以更改实验的次数。

#include <iostream>
#include <cstdlib>
#include <ctime>

#define TRIALS 1000000// 试验次数

using namespace std;

int main() {
    int switchWin = 0;  // 记录换门获胜的次数
    int stayWin = 0;    // 记录不换门获胜的次数

    srand((unsigned int)(time(NULL))); // 设置随机种子

    //
    for (int i = 0; i < TRIALS; i++) {
        int car = rand() % 3;      //在玩家猜之前先确定哪一扇门后面有奖品
        int playerChoice = rand() % 3; // 玩家在0、1、2中随机选择一扇门

        int revealedDoor;//记录被打开的那个没有奖品的门
        for (int j = 0; j < 3; j++) {
            if (j != playerChoice && j != car)//j不是玩家选的,并且j不是奖品门
            {
                revealedDoor = j; // 那么就打开j门,j=0,1,2
                break;
            }
        }

        //以下为换门操作,如果没有执行下面操作默认就是没换门
        int switchChoice;//记录玩家换到哪扇门了
        for (int i = 0; i < 3; i++)//
        {
            if (i != playerChoice && i != revealedDoor)//i不是玩家选的,并且i不是被打开的那扇门,选i相当于换门了
            {
                switchChoice = i; // 换到剩下的那扇门
                break;
            }
        }

        // 检查结果
        if (switchChoice == car) //如果换门拿到了奖品
        {
            switchWin++;
        }
        if (playerChoice == car)//如果不换门拿到了奖品
        {
            stayWin++;
        }
    }

    cout << "总共进行了 " << TRIALS << " 次试验\n";
    cout << "不换门获胜的次数: " << stayWin << "\n";
    cout << "换门获胜的次数: " << switchWin << "\n";

    cout << "换门获胜的概率: " << (double(switchWin) / TRIALS * 100) << "%\n";
    cout << "不换门获胜的概率: " << (double(stayWin) / TRIALS * 100) << "%\n";

    system("pause");//暂停程序的运行,等待用户输入
    cin.get();//和上面的system("pause")效果一样,都是暂停程序的运行,等待用户输入,但是cin.get()不会有回显,也就是提示

    return 0;
}

以下展示几次运行的结果,他们每次结果都是不一样的,但大致稳定在换门获奖的概率在2/3,不换门获奖的概率在1/3


原文地址:https://blog.csdn.net/weixin_53112343/article/details/143669411

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!