(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)!