Merhaba,
Oyunu aşağıdaki gibi bir fonksiyona dönüştürürseniz, oyunu tekrar çalıştırmak istediğinizde kolayca fonksiyonu çağırabilirsiniz.
import random
def oyna(secimler: list, degisiklik: int = 0):
hedef = random.randint(1, 3)
secim = random.choice(secimler)
if secim != hedef and degisiklik == 1:
secim = random.choice([sec for sec in secimler if sec != secim])
return degisiklik, secim == hedef
Burada oyna
isimli bir fonksiyon tanımladık. Fonksiyon secimler
ve degisiklik
isminde ve tipleri list
ve int
olan iki argüman alıyor. Fonksiyonun içinde de oyunun işlem akışına uygun bir dizi kod görüyorsunuz. Fonksiyondan dönen veri; (degisiklik, secim == hedef)
değerine sahip bir demet verisi.
Sonra, yüzdelik başarımı ölçeceğimiz bir fonksiyon yazarsak, daha sonra bu fonksiyonu istediğimiz zaman çağırarak yüzdelik başarımı ölçebiliriz.
def yuzdelik_basarim_orani(dizi: list, aranan_sonuc: int):
return str(round(len(tuple(filter(lambda i: i[1] == aranan_sonuc, dizi))) / len(dizi) * 100, 2)) + " %"
Fonksiyonun ismi fonksiyonun içinde yapılan işlemi tarif ediyor olabilir. Ama belki fonksiyonun içindeki tek satırlık kodu anlamamış olabilirsiniz. Bu tek satırlık kodun yaptığına benzer bir işlem yapan, aşağıdaki gibi bir fonksiyon da tanımlayabilirdik:
def yuzdelik_basarim_orani(dizi: list, aranan_sonuc: int):
say = 0
for i in dizi:
if i[1] == aranan_sonuc:
say += 1
return str(round(say / len(dizi) * 100, 2)) + " %"
Bu fonksiyonları yazdıktan sonra geriye artık oyunu oynatmanız kalıyor. Oyunu 10000 kere oynatalım.
Burada oyun
fonksiyonu, degisiklik
parametresine ya 0
ya da 1
değeri argüman verilerek 10000
kez çağrılır. Böylece aşağı yukarı 5000 kez değişiklik yaparak, 5000 kez de değişiklik yapmadan oyunu oynatmış oluruz.
secimler = [1, 2, 3]
sonuclar = [oyna(secimler=secimler, degisiklik=random.randint(0, 1)) for i in range(10000)]
Şimdi sonuçları, değişikik yapılıp yapılmadığına göre ayıralım; hatırlayın, oyna
fonksiyonundan degisiklik, secim == hedef
demet verisi geri dönüyordu. Burada degisiklik
değeri 1
ve 0
olanları ayıracağız.
degisiklik_yapilmis = [sonuc for sonuc in sonuclar if sonuc[0] == 1]
degisiklik_olmadan = [sonuc for sonuc in sonuclar if sonuc[0] == 0]
Şimdi de ayırdığımız listelerin başarı oranlarını ölçelim:
performans_degisiklik_yapilmis = yuzdelik_basarim_orani(degisiklik_yapilmis, 1)
performans_degisiklik_olmadan = yuzdelik_basarim_orani(degisiklik_olmadan, 1)
Sonuçları ve listelerinin uzunluklarını ekrana yazdıralım.
print(len(degisiklik_yapilmis))
print(len(degisiklik_olmadan))
print(performans_degisiklik_yapilmis)
print(performans_degisiklik_olmadan)
Sonuç:
4992
5008
66.69 %
33.51 %
Demek ki, böyle bir oyunda, eğer ilk tahminimizde doğru kapıyı tahmin edememişsek, ikinci denememizde seçtiğimiz kapıyı değiştirmemiz başarı şansımızı %33’ten, %66’ya yükseltiyor.
Tüm Kodlar
import random
def oyna(secimler: list, degisiklik: int = 0):
hedef = random.randint(1, 3)
secim = random.choice(secimler)
if secim != hedef and degisiklik == 1:
secim = random.choice([sec for sec in secimler if sec != secim])
return degisiklik, secim == hedef
def yuzdelik_basarim_orani(dizi: list, aranan_sonuc: int):
say = 0
for i in dizi:
if i[1] == aranan_sonuc:
say += 1
return str(round(say / len(dizi) * 100, 2)) + " %"
secimler = [1, 2, 3]
sonuclar = [oyna(secimler=secimler, degisiklik=random.randint(0, 1)) for i in range(10000)]
degisiklik_yapilmis = [sonuc for sonuc in sonuclar if sonuc[0] == 1]
degisiklik_olmadan = [sonuc for sonuc in sonuclar if sonuc[0] == 0]
performans_degisiklik_yapilmis = yuzdelik_basarim_orani(degisiklik_yapilmis, 1)
performans_degisiklik_olmadan = yuzdelik_basarim_orani(degisiklik_olmadan, 1)
print(len(degisiklik_yapilmis))
print(len(degisiklik_olmadan))
print(performans_degisiklik_yapilmis)
print(performans_degisiklik_olmadan)