Поэтому, увидев еще одно видео о задаче Монти Холла и узнав о методах моделирования Монте-Карло, я подумал, что попытаюсь найти процент 66,66% победы в игре, если вы поменяете двери. Проблема в том, что я получаю 50%, и при обдумывании алгоритма меня беспокоило одно: верна ли моя модель. У меня было реализовано 2 случайных предположения: одно для выбора дверей с 1 по 3 с шансом 1 из 3 и одно для выбора переключения дверей с шансом 1 из 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;
}
suitch
использует то же случайное число, что иrandom[1]
, что делает два числа связанными, что делает симуляцию недействительной. - person 1201ProgramAlarm   schedule 22.03.2020(1.*rand())/(RAND_MAX)
неправильно. Иногдаrand()
возвращаетRAND_MAX
, поэтому он выдает 1, когда требуются только значения строго меньше 1. - person Eric Postpischil   schedule 22.03.2020suitch=2.*u;
неправильно.u
не менялся с тех пор, как он использовался для установкиrandom[1]
, поэтомуsuitch
не является независимым отrandom[1]
. Это устанавливает suitch в 0 изrandom[1]
равно 0, в 0 или 1 примерно в половине случаев, когдаrandom[1]
равно 1, и в 1 почти каждый раз (из-за проблемыRAND_MAX
выше)random[1]
равно 2. Однако это может не повлиять на среднюю вероятность, поскольку случаи симметричны между значениямиrandom[1]
. - person Eric Postpischil   schedule 22.03.2020