Bir tahminde bulunup kapılardan birini seçiyorsunuz sunucunun açması için:
Sunucu, nerede ne olduğu bilgisine sahip olarak, sizin seçtiğiniz kapı dışındaki yani geriye kalan iki kapıdan birini açıyor:
Görüyorsunuz ki sunucunun açtığı kapı boş. Bunun üzerine sunucu size soruyor: "Bir kapı seçtin ve ben de bir kapı açtım. Seçtiğin kapıyı değiştirmek ister misin? Yoksa kararında ısrarcı mısın, seçtiğin kapıyı mı açalım?":
Kritik soru: Ne yapmalısınız? Başka bir deyişle, hangisinin olasılığı daha yüksektir, en başta seçtiğiniz kapıyı açtırmanız durumunda 1 milyon YTL kazanmanız mı yoksa diğer kapıyı seçip 1 milyon YTL kazanmanız mı? Dikkat: Bu soruya pek çok insan yanlış cevabı vermektedir ve bu kişiler arasında olasılık yahut istatistik ile işi icabı haşır neşir olan bilimciler de mevcuttur. Sezgileriniz yerine matematiğe mi güvenmelisiniz? Yahut bir bilgisayar modeline? ;-) Hem de kolayca kurabileceğiniz bir bilgisayar modeline!
Açmalı mı, açmamalı mı, yoksa hiç düşünmemeli mi? Ama biz düşünmezsek, biz olamayız ki!
Gelin şimdi çok basit ve programcı olmayanların dahi kolayca anlayabileceği kısacık bir bilgisayar kodu ile bu probleme açıklık getirelim.
İki stratejimiz olsun, birinci stratejimiz ne olursa olsun ilk seçtiğimiz kapıda ısrarcı olacağız ve onu açtıracağız. İkinci stratejimize göre ise ne olursa olsun seçtiğimiz kapıdan vazgeçip diğer kapıyı seçecek ve sunucuya onu açtıracağız.
Seçtiğimiz strateji hangisi olursa olsun kapıyı açtıktan sonra kazanacağız ya da kaybedeceğiz. Kazanırsak kazanç ile ilgili değişkenimizi 1 artırırız. Kazanmazsak ise artırmayız. Bu işlemi seçtiğimiz stratejilerden biri için mesela 100 kere yaparsak ve kaç kere kazandığımızı ilgili kazanç değişkenimizde depolarsak ve sonra bunu 100'e bölersek o zaman yüzde kaç olasılık ile söz konusu stratejimizin kazandığını hesaplamış oluruz.
1. stratejiyi çok basit bir Python kod parçası olarak yazalım:
kapilar = [1, 2, 3]
odullu_kapi = random.choice(kapilar)
yarismacinin_secimi = random.choice(kapilar)
if yarismacinin_secimi == odullu_kapi:
kazanc = kazanc + 1
2. stratejiyi çok basit bir Python kod parçası olarak yazalım:
kapilar = [1, 2, 3]
odullu_kapi = random.choice(kapilar)
yarismacinin_secimi = random.choice(kapilar)
if yarismacinin_secimi == odullu_kapi:
kapilar.remove(odullu_kapi)
kapilar.remove(random.choice(kapilar))
yarismacinin_yeni_secimi = kapilar[0]
else:
yarismacinin_yeni_secimi = odullu_kapi
if yarismacinin_yeni_secimi == odullu_kapi:
kazanc = kazanc + 1
Her iki durumda da kazanç değişkenimizi nasıl hesapladığımızı yukarıda gösterdik. Alışık olmayanlar için çok kısa birkaç açıklama yapmak gerekirse, random.choice(kapilar)
ifadesi kapilar
dizisindeki elemanlardan birini rastgele seçmektedir (her elemanın seçilme olasılığı eşittir, buna güvenebilirsiniz). random.remove(odullu_kapi)
gibi bir ifade ise kapilar
dizisi içinden ilgili kapıyı çıkarmakta yani diziyi küçültmektedir.
Şimdi bunca açıklamadan sonra gelelim işin özüne, her iki stratejiyi de 100 kere çalıştırıp çıkan kazanç sayıyı 100'e bölerek her iki stratejinin de kazanma olasılığını hesaplayabileceğimizi söylemiştik. Lakin burada okurun aklına birkaç soru gelebilir:
- Bu model gerçekçi midir?
- 100 kere denemek yeterli midir?
kazanc
değişkenimizde biriktirelim ve çıkan sonucu 1 milyona bölüp 100 ile çarpalım, böylece % cinsinden olasılığı hesaplayalım:
$ python sec-bakalim.py
1. strateji ile kazanma olasiligi = %33.249
2. strateji ile kazanma olasiligi = %66.958
Görülen o ki ikinci strateji yani kapıyı değiştirmek çok daha anlamlı, 1 milyon kere denedik ve bu denemelerin yaklaşık %67'sinde bu strateji kazandı. Programı bir kez daha çalıştırıp bir kez daha milyonluk bir deneme yapalım bakalım sonuç değişecek mi:
$ python sec-bakalim.py
1. strateji ile kazanma olasiligi = %33.566
2. strateji ile kazanma olasiligi = %66.752
Hemen hemen aynı! Üstelik bu denemeleri yapmak orta karar bir bilgisayarda her seferinde hemen hemen yaklaşık 1 saniye sürdü yani modelimizi kurduktan sonra çalıştırmamız, bir tür simülasyon yapıp sonuçları öğrenmemiz çok düşük maliyetli.
Modelimiz bize her halükârda başlangıçta seçtiğimiz kapıdan vaz geçip geriye kalan kapıyı seçmemizin daha kârlı olduğunu, başka bir deyişle 2. stratejiyi takip etmemiz halinde 1 milyon YTL'lik ödülü kazanma olasılığımızın %66 küsur olduğunu söylemektedir.
Bu problemin Bayes teoremi kullanarak analiz edilmiş ve benzer sonuca varılmış şeklini çeşitli yerlerde bulup inceleyebilirsiniz. Sembolik matematiksel analiz bu durumda daha güçlü bir araçtır, bunu kabul ediyorum ancak sizce hangisini anlamanın daha kolaydır, buna da siz karar verin.
Külyutmaz Bilgisayarcılar İçin Notlar
1. Programın tüm kaynak kodu aşağıdadır, bunu Ubuntu GNU/Linux üzerinde Python 2.5.2, MS Windows XP üzerinde de Python 2.6 ile denedim, yani komut satırında
python sec-bakalim.py
diyerek çalıştırdım.
sec-bakalim.py
--------------
import random
###
### "Kapiyi degistirmem stratejisi
###
kazanc = 0
for i in range(100000):
# 3 kapi var, bunlardan sadece bir tanesinin arkasinda odul var
# hangi kapinin arkasina yerlestirilecegine gelisiguzel karar veriliyor
kapilar = [1, 2, 3]
odullu_kapi = random.choice(kapilar)
# Yarismaci, odulun nerede oldugunu bilmeden bir kapi seciyor.
yarismacinin_secimi = random.choice(kapilar)
# Sunucu yarismacinin sectigi kapi haricindeki iki kapiya bakiyor
# ve bunlarin icinden odul icermeyen bir tanesini secip aciyor ve
# yarismaciya fikrini degistirip degistirmeyecegini soruyor
# Var sayalim ki yaristirmaci fikrini degistirmesin. Bu durumda
# eger secmis oldugu kapi odullu kapi ise kazanmis olur:
# Son seciminden sonra yarismaci kazandi mi?
if yarismacinin_secimi == odullu_kapi:
kazanc = kazanc + 1
olasilik = kazanc / 100000.0
print '1. strateji ile kazanma olasiligi = %' + str(olasilik * 100)
###
### "Kapiyi degistiririm stratejisi
###
kazanc = 0
for i in range(100000):
# 3 kapi var, bunlardan sadece bir tanesinin arkasinda odul var
# hangi kapinin arkasina yerlestirilecegine gelisiguzel karar veriliyor
kapilar = [1, 2, 3]
odullu_kapi = random.choice(kapilar)
# Yarismaci, odulun nerede oldugunu bilmeden bir kapi seciyor.
yarismacinin_secimi = random.choice(kapilar)
# Sunucu yarismacinin sectigi kapi haricindeki iki kapiya bakar
# ve bunlarin icinden odul icermeyen bir tanesini secip acar.
# Yarismaciya fikrini degistirip degistirmeyecegini sorar.
# Var sayalim ki yaristirmaci fikrini degistirsin ve geriye kalan
# kapilardan birini secsin
# Eger yarismaci odullu kapiyi secti ise sunucu geriye kalan odulsuz iki
# kapidan birini acar, sectigi stratejiden oturu yarismaci ilk basta sectigi
# ve az once sunucunun acmis oldugu kapinin disinda kalan yegane kapiyi secmek
# durumundadir.
if yarismacinin_secimi == odullu_kapi:
kapilar.remove(odullu_kapi)
kapilar.remove(random.choice(kapilar))
yarismacinin_yeni_secimi = kapilar[0]
# Eger yarismaci odulsuz bir kapi secti ise, sunucu odulsuz diger kapiyi acar
# ve yarismaci sectigi stratejisinden oturu kapiyi degistirir yani geriye kalan
# tek kapiyi, odullu kapiyi secer ve kazanir
else:
yarismacinin_yeni_secimi = odullu_kapi
# Son seciminden sonra yarismaci kazandi mi?
if yarismacinin_yeni_secimi == odullu_kapi:
kazanc = kazanc + 1
olasilik = kazanc / 100000.0
print '2. strateji ile kazanma olasiligi = %' + str(olasilik * 100)
2. Yazıdaki grafikleri GNU pic programlama dili ile kodlayıp GNU groff aracından faydalanarak oluşturdum ve bunun için "Making Pictures With GNU PIC" başlıklı belgeden faydalandım. Aşağıda son grafiğin kodunu görebilirsiniz (diğerlerinin tahmin edilmesi egzersiz olarak okura bırakılmıştır):
monty-hall-opened-select-which.pic
----------------------------------
.PS
## Some setup before we start drawing
scale = 2.54
golden_ratio = 1.61803399
box_width = 3
box_height = box_width * golden_ratio
box width box_width height box_height;
line < - dashed "Secmeli" above "mi?" below;
box same "X";
move;
box same "Sunucu acti ve bos!";
.PE
Yukarıdaki dosyadan bir .png dosyası elde edebilmek için önce aşağıdaki komutu verdim:
gpic monty-hall-opened-select-which.pic | groff -Tps > monty-hall-opened-select-which.ps
Daha sonra da oluşan .ps uzantılı dosyayı (PostScript dosyasını) GIMP grafik düzenleme programı ile açarak bir PNG dosyası olarak kaydettim.