Monty Hall problemi, Amerikan TV yarışma programı Let's Make a Deal'a dayanan bir olasılık bulmacasıdır. Problem adını, yarışmanın sunucusu Monty Hall'dan alır. İçinde bir paradoksu da barındırması nedeniyle Monty Hall paradoksu olarak da anılan problemin sonucu saçma görünmekle birlikte, ispatlanabilir ve doğrudur.
Problemin iyi bilinen bir açıklaması Parade dergisinde yayımlandı:
Bir yarışma programında olduğunuzu ve üç kapıdan birini seçme hakkınız olduğunu varsayalım. Kapılardan birinin ardında bir araba, diğerlerinin ardında ise keçiler var. Kapılardan birini, diyelim ki 1'inciyi seçiyorsunuz ve kapıların ardında ne olduğunu bilen sunucu, diğer kapılardan birini, diyelim ki ardında keçi olan 3'üncüyü açıyor. Daha sonra size soruyor: "2. kapıyı seçmek ister misiniz?" Seçiminizi değiştirmek sizin yararınıza mıdır?
Yarışmacı geriye kalan iki kapıdan hangisinin kazanan olduğundan emin olamadığı için, çoğu kişi bu kapıların eşit olasılığa sahip olduğunu ve seçimi değiştirmenin hiçbir şeyi değiştirmeyeceğini sanır. Aslında, problemin klasik açıklamasına göre yarışmacı seçimini değiştirmelidir. Zira böylece arabayı bulma olasılığını 1/3'ten 2/3'e çıkarır; yani ikiye katlar.
Problemin yukarıdaki açıklaması ve çözümü Parade'de yer aldığı zaman, aralarında doktora derecesi olan 1.000 civarında kişinin de bulunduğu yaklaşık 10.000 okur, dergiye yazarak, çözümün yanlış olduğunu iddia etti.
Monty Hall problemi, yaygın biçimlerinden biriyle, daha eski bir problem olan Üç Mahkum Problemine matematiksel olarak eşittir ve bunların ikisi birden daha da eski olan Bertrand'ın kutusu paradoksuyla benzerlikler gösterir. Bunlar ve olasılığın eşit olmayan şekilde dağıtımıyla ilgili diğer problemlerin doğru şekilde çözümünün zor olduğu yönünde bir inanış vardır ve bu durum problemlerin nasıl algılandığını ele alan psikolojik çalışmaların yapılmasına yol açmıştır. Monty Hall probleminin tamamıyla açık çözümüyle buna ilişkin açıklamalar, benzetme ve resmi matematiksel kanıtlar ortaya konulduğunda bile, çoğu kişi doğru yanıta şüpheyle bakmaktadır.
Problemin; popüler sözel çözümü ve olasılıklı çözümü bulunmaktadır. Olasılıklı çözümünü C++'da istediğimiz deneme sayısında farklı matrislerde tanımlayarak -ve kapı sayısını değiştirerek - ispatlayabiliriz. Bize yardımcı olacak husus ise, deneysel olasılıktaki deney sayısı değişkeninin sonsuza yaklaşımından gelen teorik olasılık olacaktır. Kısacası "random" seçimlerle benzer deneyi milyonlarca tekrarlayabiliriz ve sonuçların yaklaşımını görebiliriz.
İşte yazılımın çıktı dosyası :
Problemin iyi bilinen bir açıklaması Parade dergisinde yayımlandı:
Bir yarışma programında olduğunuzu ve üç kapıdan birini seçme hakkınız olduğunu varsayalım. Kapılardan birinin ardında bir araba, diğerlerinin ardında ise keçiler var. Kapılardan birini, diyelim ki 1'inciyi seçiyorsunuz ve kapıların ardında ne olduğunu bilen sunucu, diğer kapılardan birini, diyelim ki ardında keçi olan 3'üncüyü açıyor. Daha sonra size soruyor: "2. kapıyı seçmek ister misiniz?" Seçiminizi değiştirmek sizin yararınıza mıdır?
Yarışmacı geriye kalan iki kapıdan hangisinin kazanan olduğundan emin olamadığı için, çoğu kişi bu kapıların eşit olasılığa sahip olduğunu ve seçimi değiştirmenin hiçbir şeyi değiştirmeyeceğini sanır. Aslında, problemin klasik açıklamasına göre yarışmacı seçimini değiştirmelidir. Zira böylece arabayı bulma olasılığını 1/3'ten 2/3'e çıkarır; yani ikiye katlar.
Problemin yukarıdaki açıklaması ve çözümü Parade'de yer aldığı zaman, aralarında doktora derecesi olan 1.000 civarında kişinin de bulunduğu yaklaşık 10.000 okur, dergiye yazarak, çözümün yanlış olduğunu iddia etti.
Monty Hall problemi, yaygın biçimlerinden biriyle, daha eski bir problem olan Üç Mahkum Problemine matematiksel olarak eşittir ve bunların ikisi birden daha da eski olan Bertrand'ın kutusu paradoksuyla benzerlikler gösterir. Bunlar ve olasılığın eşit olmayan şekilde dağıtımıyla ilgili diğer problemlerin doğru şekilde çözümünün zor olduğu yönünde bir inanış vardır ve bu durum problemlerin nasıl algılandığını ele alan psikolojik çalışmaların yapılmasına yol açmıştır. Monty Hall probleminin tamamıyla açık çözümüyle buna ilişkin açıklamalar, benzetme ve resmi matematiksel kanıtlar ortaya konulduğunda bile, çoğu kişi doğru yanıta şüpheyle bakmaktadır.
Problemin; popüler sözel çözümü ve olasılıklı çözümü bulunmaktadır. Olasılıklı çözümünü C++'da istediğimiz deneme sayısında farklı matrislerde tanımlayarak -ve kapı sayısını değiştirerek - ispatlayabiliriz. Bize yardımcı olacak husus ise, deneysel olasılıktaki deney sayısı değişkeninin sonsuza yaklaşımından gelen teorik olasılık olacaktır. Kısacası "random" seçimlerle benzer deneyi milyonlarca tekrarlayabiliriz ve sonuçların yaklaşımını görebiliriz.
İşte yazılımın çıktı dosyası :
Kaynak Kodu:
//C++ Programming Language
//zafercavdar
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <ctime>
double montyhall = 66.66666666;
int room = 3;
//total_try durumun ne kadar denenecegini gösterir
int total_try = 1000000;
//try2 tekrarlı deneyin ne kadar tekrarlanacagını belirler
//örnegin 1milyon defa denemeli deneyden 10 kere tekrarlanır
int try2 = 10;
int deneme_ok = 0;
int total_ok = 0;
int selection2[1000];
int check (int value)
{
int kont = 0;
for (int k = 0 ; k < room-2 ; k++)
if (value == selection2[k])
{
kont = 1;
break;
}
return kont;
}
int main()
{
int car_room;
int selection;
srand(time(0));
for (int a = 0 ; a < try2 ; a++)
{
deneme_ok = 0;
for (int loop = 0 ; loop < total_try ; loop ++)
{
car_room = rand()%room;
selection = rand()%room;
int i=0;
while (i < (room-2) )
{
selection2[i] = rand()%room;
if (selection2[i] != selection && selection2[i] != car_room )
i++;
}
int selection3 = 99999999;
selection3 = rand()%room;
while (selection3 == selection || check(selection3) == 1)
selection3 = rand()%room;
if (selection3 != car_room)
deneme_ok ++ ;
}
total_ok += deneme_ok;
double pos = double(deneme_ok)/total_try;
pos = 1 - pos;
pos *= 100;
printf("%d )\nPositive Result : %d\nTotal Try : %d\nProbability : %lf\n\n",a+1,deneme_ok,total_try,pos);
}
//system("color 2f");
double pos2 = double (total_ok)/(total_try * try2) ;
pos2 = 1-pos2;
pos2 *= 100;
printf("Durum : %d\nTum Olay: %d\nOlasilik: %lf\n",total_ok,try2*total_try,pos2);
printf("\nMonty Hall : %lf\n",montyhall);
double fark = montyhall-pos2;
if (fark < 0)
fark *= -1;
printf("\nMutlak Fark : [MontyHall - Deney] = %lf\n",fark);
getchar();
}
//zafercavdar
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <ctime>
double montyhall = 66.66666666;
int room = 3;
//total_try durumun ne kadar denenecegini gösterir
int total_try = 1000000;
//try2 tekrarlı deneyin ne kadar tekrarlanacagını belirler
//örnegin 1milyon defa denemeli deneyden 10 kere tekrarlanır
int try2 = 10;
int deneme_ok = 0;
int total_ok = 0;
int selection2[1000];
int check (int value)
{
int kont = 0;
for (int k = 0 ; k < room-2 ; k++)
if (value == selection2[k])
{
kont = 1;
break;
}
return kont;
}
int main()
{
int car_room;
int selection;
srand(time(0));
for (int a = 0 ; a < try2 ; a++)
{
deneme_ok = 0;
for (int loop = 0 ; loop < total_try ; loop ++)
{
car_room = rand()%room;
selection = rand()%room;
int i=0;
while (i < (room-2) )
{
selection2[i] = rand()%room;
if (selection2[i] != selection && selection2[i] != car_room )
i++;
}
int selection3 = 99999999;
selection3 = rand()%room;
while (selection3 == selection || check(selection3) == 1)
selection3 = rand()%room;
if (selection3 != car_room)
deneme_ok ++ ;
}
total_ok += deneme_ok;
double pos = double(deneme_ok)/total_try;
pos = 1 - pos;
pos *= 100;
printf("%d )\nPositive Result : %d\nTotal Try : %d\nProbability : %lf\n\n",a+1,deneme_ok,total_try,pos);
}
//system("color 2f");
double pos2 = double (total_ok)/(total_try * try2) ;
pos2 = 1-pos2;
pos2 *= 100;
printf("Durum : %d\nTum Olay: %d\nOlasilik: %lf\n",total_ok,try2*total_try,pos2);
printf("\nMonty Hall : %lf\n",montyhall);
double fark = montyhall-pos2;
if (fark < 0)
fark *= -1;
printf("\nMutlak Fark : [MontyHall - Deney] = %lf\n",fark);
getchar();
}