Bu kodu nasıl çoklu çalıştırabilirim(100 kadar)?

3 kapının bulunduğu bir yarışmada bu kapılardan sadece birinin ardında ödül var, yarışmacı seçimini yaptıktan sonra kalan iki kapıdan biri açılıyor ve ardında ödül olmadığı görülüyor. Ve yarışmacıya tekrar seçme hakkı sunuluyor. Bu durumda ilk seçtiği kapıyla devam etmek ve seçtiği kapıyı değiştirmek arasında hangisinin daha mantıklı olduğunu görmek için basit bi kod yazdım ama bunu nasıl çok sayıda çalıştırıp olasılıkları bulacağım bilmiyorum.

import random
x = random.randint(1, 3)            # ödül
y = int(input("1, 2 or 3?\t"))      # yarışmacının seçtiği seçenek

b=0
while b<1:
    a=random.randint(1,3)           # elenen seçenek
    b += 1
    if a==y or a==x:
        b -= 1
    else:
        y = int(input("still %d?\t" %y))
        print("your final answer:",y)
        if y==x:
            print("car in the door", x, "\n\tyou win!")
        else:
            print("car in the door", x, "\n\tyou lose!")

For döngüsüyle şöyle bi şey denedim ama 0 ya da 100 veriyor. Sıkıntı a değişkeninde ama nasıl düzeltebilirim bilmiyorum.

import random
x = random.randint(1, 3)          # ödül
y = 1                             # yarışmacının seçtiği seçenek

count=0
for i in range(0, 100):
    b=0
    while b<1:
        b += 1
        a=random.randint(1,3)     # elenen seçenek (3. seçenek)
        if a!=y and a!=x:
            if y==x:
                count+=1
        else:
            b-=1
            

print(count)

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)
3 Beğeni

Bu detaylı yorumunuz için teşekkürler ama bu kısmı tam anlayamadım:

Burada sonuclar listesini ikiye ayırıyoruz. Oyun sonuçları sonuclar isimli bir listede yer alıyordu:

sonuclar = [oyna(secimler=secimler, degisiklik=random.randint(0, 1)) for i in range(10000)]

Hatırlarsanız, oyun fonksiyonundan aşağıdaki gibi bir tuple verisi dönüyordu.

def oyun(secimler: list, degisiklik: int = 0):
    [...]    
    return degisiklik, secim == hedef

oyun fonksiyonu çağrılırken degisiklik isimli parametreye 0 ya da 1 değerini veriyoruz. Bu değer fonksiyonun içinde yer alan aşağıdaki sorguda kullanılıyor:

    [...]
    if secim != hedef and degisiklik == 1:
        secim = random.choice([sec for sec in secimler if sec != secim])
    return degisiklik, secim == hedef

Buradaki if secim != hedef and degisiklik == 1: ifadesi True değerini aldığı zaman yeni bir kapı seçiyoruz.

Fonksiyon çalışmasını bitirince sonuçla birlikte değişiklik değerini de geri döndürüyoruz ki sonuçları değişiklik yapılıp yapılmadığına göre ayırabilelim.

Buradaki secim == hedef mi sorgusu True değerini verirse, tahminimiz doğrudur, değilse yanlıştır. Tahminimiz ne olursa olsun, sonucu değişiklik ile birlikte fonksiyondan geri döndürüyoruz ve sonuclar listesine eklediğimiz oyunların hangilerinde değişiklik yapıldığını bulmak için, demet verisinin ilk elemanını kullanarak bir filtreleme yapıyoruz. Bu eleman 0 ise, oyunda herhangi bir değişiklik yapılmamıştır, 1 ise değişiklik yapılmıştır.

Yani, şu ifade;

degisiklik_yapilmis = [sonuc for sonuc in sonuclar if sonuc[0] == 1]
degisiklik_olmadan = [sonuc for sonuc in sonuclar if sonuc[0] == 0]

aşağıdaki ifade ile -hemen hemen- aynı işlemi yapıyor aslında.

degisiklik_yapilmis = []
degisiklik_olmadan = []
for sonuc in sonuclar:
    if sonuc[0] == 1:  # Değişiklik yapılmış
        degisiklik_yapilmis.append(sonuc)
    elif sonuc[0] == 0:  # Değişiklik yapılmamış
        degisiklik_olmadan.append(sonuc)