三门问题
本帖最后由 chanji 于 2020-12-27 11:03 编辑三门问题(换门):
#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;
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 = 1;
doors = 1;
doors = 2;
choose = random(0,2);//玩家随机选择其中一个门
if(choose == 0) {//根据规则得到结果
result = 2;
}
else if(choose == 1) {
result = 2;
}
else {
result = 0;
}
if(doors == 2) {//判断门后是否为汽车,如果为汽车,则统计量加1
++success;
}
}
else if(mode == 2) {//模式二为车、羊、羊
doors = 2;
doors = 1;
doors = 1;
choose = random(0,2);
if(choose == 0) {
result = 1;
}
else if(choose == 1) {
result = 0;
}
else {
result = 0;
}
if(doors == 2) {
++success;
}
}
else {//模式三为羊、车、羊
doors = 1;
doors = 2;
doors = 1;
choose = random(0,2);
if(choose == 0) {
result = 1;
}
else if(choose == 1) {
result = 0;
}
else {
result = 1;
}
if(doors == 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;
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 = 1;
doors = 1;
doors = 2;
game(success);
}
else if(mode == 2) {//模式二为车、羊、羊
doors = 2;
doors = 1;
doors = 1;
game(success);
}
else {//模式三为羊、车、羊
doors = 1;
doors = 2;
doors = 1;
game(success);
}
}
cout << success << endl;//输出成功的总数
return 0;
}
void game(int &success) {
int result;
result = random(0,2);//随机选择一扇门
if(doors == 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
由此可见,三门问题的结论是正确的。
页:
[1]