Парадокс Монти-Холла или кручу верчу, запутать хочу
Парадокс Монти Холла получил свое название от ведущего телевизионного шоу "Let's Make a Deal". Игровая ситуация:
Перед игроком три двери, за одной из которых приз. Игрок выбирает одну из них, не открывая. После этого ведущий, открывает одну из двух оставшихся дверей. Ведущий знает, за какой из дверей приз, и всегда открывает дверь, за которой приза нет. Далее игроку предлагается поменять первоначально выбранную дверь на другую, остающуюся закрытой. Вопрос: повышаются ли шансы игрока при изменении выбранной двери?
Парадокс заключается в том, что интуитивно кажется, что смена двери ничего не дает. Приз либо за одной дверью, либо за другой. Ситуация симметричная, и вероятности одинаковы. Однако, теория вероятностей показывает, что смена двери повышает шансы выигрыша в два раза.
И с одной стороны так и есть. Если представить, что за дверьми находятся нули и единица, то вроде бы процент оставшейся двери увеличивается.
Три двери, первая верная, вторая и третья - неверные. Возможны три сценария:
1)Ты выбрал первую дверь, вторую убрали, при смене выбора ты проиграешь.
2)Ты выбрал вторую дверь, третью убрали, при смене выбора ты выиграешь.
3)Ты выбрал третью дверь, вторую убрали, при смене выбора ты выиграешь.
Но не кажется ли вам странным, что если дверей 1000, открыли 998, то почему-то у первой выбранной двери процент стремится к нулю
написал программу на си, где процент выигрыша при данном методе действительно 67.
у нас есть три двери. с нулями и единицей. выбранную рендомом дверь мы обнуляем, так как эту дверь по принципу Монти-Холла мы игнорируем. смотрим, осталась ли за дверьми единичка простым сложением. если осталась, то суммируем данный цикл +1.
в итоге просто смотрим процент этого парадокса
#include<stdio.h>
#include <stdlib.h>
int main()
{
int sum,i;
float sum2=0;
int a[]={0,0,1};
for (i=0;i<10000;i++)
{
a[rand()%3]=0;
sum=a[0]+a[1]+a[2];
if (sum>0)
sum2+=1;
a[0]=0;
a[1]=0;
a[2]=1;
}
//printf("Welcome to Online IDE!! Happy Coding :)");
printf("Welcome to Online IDE!! Happy Coding %f\n)", sum2/100);
return 0;
}
теперь добавил к программе тот факт, что каждый цикл двери меняются местами
#include<stdio.h>
#include <stdlib.h>
int main()
{
int sum,i;
float sum2=0;
int a[]={0,0,1};
for (i=0;i<1000000;i++)
{
a[rand()%3]=0;
sum=a[0]+a[1]+a[2];
if (sum>0)
sum2+=1;
a[0]=rand()%2;
a[1]=rand()%2;
a[2]=rand()%2;
if (a[0]==1)
{
a[1]=0;
a[2]=0;
}
else if (a[1]==1)
a[2]=0;
}
//printf("Welcome to Online IDE!! Happy Coding :)");
printf("Welcome to Online IDE!! Happy Coding %f\n)", sum2/10000);
return 0;
}
получилось около 58%. но так как рендом в си кривой и мои руки тоже, то где-то может быть обшибка. может кто-то перепишет с прямыми руками
пы.сы. если подкидывать монетку 20 раз, где 15 раз выпал орел, это всего лишь значит что монетка кривая, никак иначе