【发布时间】:2020-03-22 00:00:17
【问题描述】:
所以在看了另一个关于蒙蒂霍尔问题的视频后,并且因为我了解了蒙特卡洛模拟方法,我想如果你换门,我会尝试找到 66.66% 的游戏获胜百分比。问题是我得到了 50%,而在考虑算法时担心的一件事是我的模型是否正确。我实施了 2 个随机猜测,一个用于选择 1 到 3 的门,有 3 分之一的机会,一个用于选择切换门,有 2 分之一的机会。 if 语句用于分配具有奖品的门以及每种猜测的不同可能性。我不知道我是否可以减少那部分,但它现在有效(我认为)。我的想法哪里不对?你能建议我的算法修复吗?非常感谢!
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int seed=time(NULL);
srand(seed);
double u, random[2], suitch=0.0, total=0.0;
int nall=10000000, nright=0, i, door[3], k, j;
for(j=0; j<nall; j++)
{
for(i=0; i<3; i++)
random[i]=0.0, door[i]=0;
for(i=0; i<2; i++)
{
u=(1.*rand())/RAND_MAX;
random[i]=3.*u;
//printf("%lf\t%lf\n",u,random[i]);
}
suitch=2.*u;
//printf("%lf\n",suitch);
if(floor(random[0])==0)
door[0]=1, door[1]=0, door[2]=0;
else if(floor(random[0])==1)
door[0]=0, door[1]=1, door[2]=0;
else if(floor(random[0])==2)
door[0]=0, door[1]=0, door[2]=1;
for(i=0; i<3; i++)
//printf("%d\t",door[i]);
if((floor(random[1])==0)&&(floor(suitch)==0))
k=door[0];
else if((floor(random[1])==1)&&(floor(suitch)==0))
k=door[1];
else if((floor(random[1])==2)&&(floor(suitch)==0))
k=door[2];
else if((floor(random[1])==0)&&(floor(suitch)==1))
{
if(door[1]==1)
k=door[1];
else if(door[1]==0)
k=door[2];
}
else if((floor(random[1])==1)&&(floor(suitch)==1))
{
if(door[0]==1)
k=door[0];
else if(door[0]==0)
k=door[2];
}
else if((floor(random[1])==2)&&(floor(suitch)==1))
{
if(door[0]==1)
k=door[0];
else if(door[0]==0)
k=door[1];
}
if(k==1)
nright++;
}
total=1.*nright/nall;
printf("%d\t%d\t%lf\t", k, nright, total);
return 0;
}
【问题讨论】:
-
乍一看,我的想法是,您是否考虑过使用变量和函数名称以便了解发生了什么?如果你真的想过火,也许可以在评论中描述基本问题。
-
随机访问超出范围。
-
我猜 random[2] 代表奖品在哪里。您错误地将奖品的位置建模为四处移动。它从不移动。 (在我发布答案之前,我问这是否是 random 所代表的 - 需要澄清。)
-
我的编程知识非常基础和简单,足以解决物理和数学问题。我不知道 c 语言能做什么。只是提醒一下,所以人们不会说“你为什么不那样做,使用那个,添加那个等等”。我只是想梳理一下算法的逻辑。
-
Random[2] 选择是否要切换(floor(random[2])=0->no switch, floor(random[2])=1->switch)。 Door[3] 是奖品(1=赢,0=输)。
标签: c simulation simulator montecarlo