Yazı Tura Oyunu Sorusu ve Matlab Çözümü
Yazı Tura Oyunu Sorusu ve Matlab Çözümü

Selamlar !

Evet bu bir facebook paylaşımı ve soru aynen şöyle:

250 defa yazı tura atıyorsun, en fazla kaç defa peş peşe yazı gelirse o kadar puan alıyorsun. Hep tura gelirse 0 puan, hep yazı gelirse 250 puan, en fazla 10 defa peş peşe yazı gelirse de 10 puan. Oyun böyle. Bu oyunu çok çok oynasan, diyelim 1 milyar defa oynasan, aldığın puanların ortalaması yaklaşık kaç olur? Yani oyun başına beklentin kaçtır?

 

Soruyu çözmek üzere başta bazı olasılık teoremleri ve hesaplamaları araştırdım. Hatta whatsapp gruplarımda paylaşıp çözen olur diye ümitlendim ama olmadı. “Central limit theorem” ve “expected value” çözüm için önerilen bazı anahtar terimlerdendi.

Neyse ki Matlab bilgisayarımda yüklüydü ve bu soruyu çok daha eğlenceli bir yoldan çözebilecektim.

KOD YAZARAK ! 🙂

 

Bölüm 1: 250 adet para attırmak:

Matlab’da yazı tura gibi ifadeler olmadığı için, bunları simgeleyecek olan sayısal değerleri ‘0’ ve ‘1’ olarak seçtim. Yazı, ‘0’ olsundu.

Parayı atma olayı ve yazı-tura rastgeleliğini sağlamak için ise “randi” fonksiyonunu kullandım.

x = randi([0 1],1,250);

Bu kod parçası 0 ya da 1 olmak üzere 250 tane rastgele değer oluşturuyor. Bu dizi bizim bir oyunumuzu ifade ediyor. 250 defa atılmış para ve yazı-tura olayları bu kod ile sağlanıyor.

İşte 250 defa yazı-tura atılmış bir oyun dizisi:

1 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 1 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1

 

Bölüm 2: Puan hesaplamak:

Oyundaki kurala göre art arda egelen yazı’ları yani ‘0’ları saymamız gerekli. Bunu da iç içe dönen 2 for döngüsü ile gerçekleştirdim:

point = 0;
points = zeros(1,250);
for i = 1:250
     k = x(i);
     if k == 0
     for j = i:249
          if k == x(j+1)
               point = j+2-i;
          else
               points(i) = point;
               break;
          end
     end
     end
end

Böylece points adlı bir dizide, herhangi bir dizi elemanının kendinden sonra kaç tane yazı geldiği bilgisini tutuyoruz. Yani eğer bu dizideki en büyük sayıyı hesaplarsak, bize bu oyundaki puanımızı verir.

max(points);

 

Yukarıda vermiş olduğum oyun dizisinde bu algoritmayı uygulayarak, puanımızı 5 olarak hesapladım. Bir defa oynanan oyunlarda puan 5 ile 9 arasında değişiyor.

 

Bölüm 3: Beklentiyi hesaplamak, (milyon defa oyun oynamak):

Yukarıdaki 250’lik oyunu ve puan hesaplama işlemini milyon defa gerçekleştirmek bilgisayarım için pek mümkün değil. Onun yerine yine yeterince büyük bir sayı belirlemek ve beklentiyi hesaplamak üzere puanın bir değere oturması (yakınsaması) için dua etmek gerekti.

Oynanan oyun sayısı arttıkça ortalama puan değerleri 7.2884 gibi bir değere doğru yakınsıyor. Oyun sayısını çok çok daha arttırsak, yine de bu değer etrafında salınacağını bildiğimiz için, sorumuzun cevabının bu olduğunu söyleyebiliriz.

Peki bunu öğrenip rahatlayıp duracak mıyız? Hayır..

 

 

Bölüm 4: Farklı oyun uzunlukları için beklentileri hesaplamak ve yorumlamak:

Soruda verilen oyun uzunluğu 250 idi. Acaba bunu 256 yaparsak, beklentimiz 7.2’den 8’e fırlar mı? Bu gibi sorulara cevap olması için yazmış olduğum kodu parametreler tanımlayarak yeniden düzenledim ve merak ettiğim uzunluk değerleri için tekrar simüle ettim. Ne yazık ki beklediğim üzere 256 uzunluk için cevap 8 çıkmadı. Kendi kendime 8’i tutturmak için bu uzunluğu arttırdım. En sonunda 500 oyun uzunluğuna doğru beklenti değeri 8’e yükseldi.

Anlayacağınız bir süre sonra beklenti değerinin oyun uzunluğuna bağlı olan artışı yavaşlıyor. E şimdi böyle bir yorum yaptım, buna bir de görsel kanıt lazım:

 

Gördüğünüz üzere, para atma sayısını yani bir oyun uzunluğunu arttırdıkça beklenti eksponansiyel bir eğri üzerinde bir noktaya yakınsıyor. Bu noktanın ne olduğunu henüz bulabilmiş değilim fakat içimden bir ses 10 demiyor değil. 🙂

(Grafiği çizdirmek için oldukça fazla simülasyon yapmak gerektiği için iterasyon sayısını biraz düşürdüm. Bu sebeple, 250 uzunluklu oyunda 7.28 yerine 7.294 hesaplanmış. Bu kafanızı karıştırmasın. İterasyon arttırılarak daha hassas grafik çizdirilebilir fakat grafik şekil olarak aynı kalacaktır.)

 

Bölüm 5: Gerçek bir oyuna ne dersin?

Soruda bahsi geçen oyunu bir gazinoya uyarlayalım. Oyuna katılan her müşteri bir giriş ücreti ile girsin. Oyun boyunca ise soru kuralları geçerli olsun ve puan, müşterinin oyundan ayrılırken alacağı parayı belirlesin.

 

Senaryo 1) Müşteri oyuna 10 tl ile girer ve 250 defa yazı-tura attıktan sonra puanı kadar olan parayı alıp çıkar.

Bu senaryoda 10 tl beklenti puanı olan 7.28’ten yüksek olduğu için gazino sahibi uzun zaman zarfında her türlü kazanacaktır. Bu kazanç kolayca 10 – 7.28 ile hesaplanabilir. Gazino neredeyse hiç risk almamış olur. Müşterilerin ise pek azı giriş ücretini geçerek para kazanabilir.

 

Senaryo 2) Müşteri oyuna 10 tl ile girer ve istediği kadar uzun süre oyunda kalarak puan kazanmaya çalışır. Çıkışta puanı kadar parayı alır.

İlk senaryo oyun uzunluğu 250 olarak net olarak belirlenmişti. Bir müşterinin bir yazı tura atma süresi yaklaşık 1 sn olarak hesaplansa 250 yazı-tura 5 dk gibi bir sürede bitecektir. Ki bu da bu tarz bir oyun için ideal süre olarak var sayılabilir. Peki bu oyun uzunluğu sınırını kaldırsak ve müşteriye bıraksak?
İstediği zaman çıkılabileceğini duyan müşteriler daha istekli olacaktır ve daha çok oynamak isteyecektir. Sıkılma eşiği aşağı yukarı zaten 250 oyun uzunluğu olduğu için beklenti değeri 7.28’i çok da aşmayacaktır. Oldu ki çok azimli bir müşteri geldi ve oyunu bırakmak istemiyor. 2. figürdeki grafikten de anlaşılacağı üzere, müşteri 600 uzunluklu oyuna kadar hala daha giriş ücreti olan 10 tl’yi kazanacak beklenti değerine ulaşamamış olacak.

Bu senaryoda, müşterinin kazanma ihtimali ve oyun oynama isteği arttırılmış, gazinoya ise bir miktar risk getirilmiştir. Fakat gazino hala daha uzun vadede kazanan taraf olacaktır.

 

 

 

Ne demişler, kasa her zaman kazanır..

 

 

 


Yazılan Matlab kaynak kodu:

https://github.com/ahmetselmankurt/Yaz-Tura-Oyunu

Soru kaynağı:

1 Comment

  1. Ali Nesin’in sorusunun caevabını yanlış düşünmüşsünüz..Teorik soruların cevabı teorik olur.”Bu oyunu mesala çok oynasan ,atıyorum 1 milyar..” kime göre çok???.Bu para kuzey kutbuna yakın bölgede mi? yoksa güny kutbuna yakın bölgedemi atılıyor ,yoksa ekvatorda mı?Elin titriyor mu ,kaç metre yükseğe atıyorsun?Deniz seviyesinden ne kadar yüksektesin,rüzgarın hızı ne;Anlyacağın yaşamsal faktöryeller,bir programa aktarmak ve olasılıkları düz bir hesapla hesaplıyan bir cihaz bu sonuca ulaşamaz.Sorunun değişkenlerine göre cevap vermek gerekir.Bir insan içinde bu son derece kolaydır.”beklentin nedir?” Cevap:Toplam tur sayısının en az yarısı kadar puan alırım.

Bir Cevap Yazın