Python random modu hakkında yardım

10 soruluk ve her soru çoktan şeçmeli olup 5 tane şıkkı olan bir test hazırlamak istiyorum. Test bittikten sonra testi 4 defaya kadar tekrar çözdürmek istiyorum ve soruların yerleri farklı şıkların yerleri farklı olacak bunu nasıl yapabilirim random komutu ile bunu yapamadım yardımcı olur musunuz

import random

print(“sınavınız başlıyor bol şans”)
dogrular=[]
yanlıslar=[]
soru1= “2+2 nedir?”
print(soru1)
sıklar={“A” : 1, “B”: 2, “C”: 3, “D”: 4, “E”: 5}

doru1=[“D”, “d”]
print(sıklar)
cevap=input(“SIKKI YAZIN”)
if cevap in doru1:
dogrular.append(“1. soru doğru”)
else:
yanlıslar.append(“1. soru yanlış cevabı d olacaktı”)

soru2= “3*3 nedir?”
print(soru2)
sıklar2={“A” : 3, “B”: 6, “C”: 9, “D”: 12, “E”: 15}
doru2=[“C”, “c”]
print(sıklar2)
cevap2=input(“SIKKI YAZINIZ”)
if cevap2 in doru2:
dogrular.append(“2. soru doğru”)
else:
yanlıslar.append(“2. soru yanlış cevap c olcaktı”)

soru3= “5+15 kaçtır?”
print(soru3)
sıklar3={“A” : 5, “B”: 15, “C”: 20, “D”: 25, “E”: 35}
doru3=[“C”, “c”]
print(sıklar3)
cevap3=input(“ŞIKKI YAZINIZ”)
if cevap3 in doru3:
dogrular.append(" 3. soru doğru")
else:
yanlıslar.append(“3. soru yanlış cevap c olcaktı”)
soru4= “5+5 kaçtır”
print(soru4)
sıklar4={“A” : 3, “B”: 5, “C”: 6, “D”: 7, “E”: 10}
doru4=[“e”, “E”]
print(sıklar4)
cevap4=input(“Şıkkı yazınız”)
if cevap4 in doru4:
dogrular.append(“4. soru doğru”)
else:
yanlıslar.append(“4. soru yanlış cevap e olmalıydı”)
soru5= “32+32 kaçtır?”
print(soru5)
sıklar5={“A” : 16, “B”: 24, “C”: 64, “D”: 128, “E”: 55}
doru5=[“C”, “c”]
print(sıklar5)
cevap5=input(“SIKKI YAZIN”)
if cevap5 in doru5:
dogrular.append(“5. soru dogru”)
else:
yanlıslar.append(“5. soru yanlş cevap c olcaktı”)

print(dogrular)
print(yanlıslar)
puan=len(dogrular) * 10
print(str(“puanınız”)+str(puan))

tekrar=input(“sınavı tekrar çözmek ister misiniz? evet için y yazınız”)
dorut=[“Y”, “y”]
if tekrar in dorut:
print(“sınava başlıyoruz”)

sorulartoplam=[[soru1],[soru2],[soru3],[soru4],[soru5]]
test2=random.sample(sorulartoplam,1)
print(test2)
cevaplartoplam=[[soru1(values)]]

1 Beğeni

Merhaba hoş geldiniz.

Böyle bir problemi ben şu şekilde çözerdim. Bu arada umarım fonksiyon kavramına ve dict comprehension kavramına aşinasınızdır.

  1. Soruları, soruların şıklarını ve doğru cevabı bir sözlük içerisinde tutardım.
sorular = {
    "2 + 2 kaç eder?": {
        "seçenek": {
            "A": 1,
            "B": 2,
            "C": 3,
            "D": 4,
            "E": 5
        },
        "cevap": 4
    },
    "3 * 3 kaç eder?": {
        "seçenek": {
            "A": 3,
            "B": 6,
            "C": 9,
            "D": 12,
            "E": 15
        },
        "cevap": 9
    }
}
  1. Sonra bu sözlüğün anahtarları olan soruları ve her bir anahtarın değeri olan alt sözlüğün seçenekler anahtarına ait değerleri rastgele hale getiren bir fonksiyon yazardım.
import random


def rastgele_yap(sozluk: dict):
    return {
        soru: {
            "seçenek": {
                secenek: cevap
                for secenek, cevap in zip(
                    sozluk[soru]["seçenek"],
                    random.sample(
                        list(sozluk[soru]["seçenek"].values()),
                        len(sozluk[soru]["seçenek"])
                    )
                )
            },
            "cevap": sozluk[soru]["cevap"]
        }
        for soru in random.sample(list(sozluk), len(sozluk))
    }
  1. Sonra, her bir soru için doğru şıkkı getiren bir fonksiyon yazardım.
def secenegi_getir(sozluk: dict, soru: str):
    for k, v in sozluk[soru]["seçenek"].items():
        if sozluk[soru]["cevap"] == v:
            return k
  1. Sonra, sınavı ve puanlama işlemini düzenleyen fonksiyonu yazardım. Sınava başlamadan önce soruları rastgele bir hale getiren fonksiyonu çağırır, soruların ve cevapların yerlerini değiştirirdim.
def sinav_olustur(sozluk: dict):
    yanlislar = 0
    dogrular = 0
    print("Sınava başlıyoruz!")
    yeni = rastgele_yap(sozluk)
    for soru in yeni:
        print(soru)
        print(yeni[soru]["seçenek"])
        cevap = input("Şıkkı Yazın: ")
        while cevap.upper() not in yeni[soru]["seçenek"]:
            print("Lütfen şıklardan birini seçin!")
            cevap = input("Şıkkı Yazın: ")
        if yeni[soru]["seçenek"][cevap.upper()] != yeni[soru]["cevap"]:
            print(f"Yanlış şık! Cevap {secenegi_getir(yeni, soru)}!")
            yanlislar += 1
        else:
            print("Doğru cevabı verdiniz!")
            dogrular += 1
    print("Sınav bitti!")
    print("Toplam Doğru:", dogrular)
    print("Toplam Yanlış:", yanlislar)
  1. Sonra sınavı kaç kez tekrar edileceğini belirlerdim.
def sinavi_tekrar_yap(sozluk: dict, sayi: int):
    for tekrar in range(sayi):
        print(f"{tekrar + 1}. Sınav")
        sinav_olustur(sozluk)
        print()
  1. Son olarak da sinavi_tekrar_yap fonksiyonunu, sorular sözlüğünü ve tekrar sayısını parametre olarak vererek çağırırdım.
sinavi_tekrar_yap(sorular, 4)

Genel hatlarıyla anlattığım bu uygulamanın tam hali aşağıdadır.

import random


def rastgele_yap(sozluk: dict):
    return {
        soru: {
            "seçenek": {
                secenek: cevap
                for secenek, cevap in zip(
                    sozluk[soru]["seçenek"],
                    random.sample(
                        list(sozluk[soru]["seçenek"].values()),
                        len(sozluk[soru]["seçenek"])
                    )
                )
            },
            "cevap": sozluk[soru]["cevap"]
        }
        for soru in random.sample(list(sozluk), len(sozluk))
    }


def secenegi_getir(sozluk: dict, soru: str):
    for k, v in sozluk[soru]["seçenek"].items():
        if sozluk[soru]["cevap"] == v:
            return k


def sinav_olustur(sozluk: dict):
    yanlislar = 0
    dogrular = 0
    print("Sınava başlıyoruz!")
    yeni = rastgele_yap(sozluk)
    for soru in yeni:
        print(soru)
        print(yeni[soru]["seçenek"])
        cevap = input("Şıkkı Yazın: ")
        while cevap.upper() not in yeni[soru]["seçenek"]:
            print("Lütfen şıklardan birini seçin!")
            cevap = input("Şıkkı Yazın: ")
        if yeni[soru]["seçenek"][cevap.upper()] != yeni[soru]["cevap"]:
            print(f"Yanlış şık! Cevap {secenegi_getir(yeni, soru)}!")
            yanlislar += 1
        else:
            print("Doğru cevabı verdiniz!")
            dogrular += 1
    print("Sınav bitti!")
    print("Toplam Doğru:", dogrular)
    print("Toplam Yanlış:", yanlislar)


def sinavi_tekrar_yap(sozluk: dict, sayi: int):
    for tekrar in range(sayi):
        print(f"{tekrar + 1}. Sınav")
        sinav_olustur(sozluk)
        print()


sorular = {
    "2 + 2 kaç eder?": {
        "seçenek": {
            "A": 1,
            "B": 2,
            "C": 3,
            "D": 4,
            "E": 5
        },
        "cevap": 4
    },
    "3 * 3 kaç eder?": {
        "seçenek": {
            "A": 3,
            "B": 6,
            "C": 9,
            "D": 12,
            "E": 15
        },
        "cevap": 9
    }
}

sinavi_tekrar_yap(sorular, 4)
1 Beğeni

üstat gerçekten çok güzel yapmışsın böyle bir şey beklemiyordum demek ki yapılabiliyormuş ben çok düşündüm yapmaya çalıştım ama testi 2.defa başlatamıyordum sadece. Bir kaç şey daha ekleme yapabilir miyiz hocam test yaptığın gibi kendiliğinden 2. teste aktarıyor sonra 3e aktarıyor ve böyle devam ediyor.
1- Her test arasında test bittikten sonra [ testi tekrar çözmek ister misin? y/n ? ] diye ekleme yapabilir miyiz ve ayrıyetten bunun devamında y dediğimizde 2. testi yine random sorular ve random şıklar olarak devam ettirebilir miyiz.
2- Kullanıcıya sorular birer birer sunulacak. Yani kullanıcı 1. Soruyu görecek,
cevaplandıracak (a, b, c, d, e girecek klavyeden) ve ardından 2. Soruya geçecek.
*Kullanıcı soruları boş bırakamaz.

  • Kullanıcı 10 soruyu da tamamladıktan sonra ekrana sınav özeti gelecek. Bu sınav
    özetinde; toplam doğru ve yanlış cevap sayıları, toplam puan (her soru 10 puan ve
    doğru yanlışı götürmeyecek) yer almakla birlikte kullanıcının vermiş olduğu doğru ve
    yanlış cevaplar ayrıca listelenecek (yanlış cevaplar doğru cevaplarıyla birlikte).
    Örneğin;
    10 sorudan oluşan testimizde 7 soruya doğru cevap verdiniz, 3 soruya yanlış cevap
    verdiniz. 1., 4., 5., 6., 7., 8. ve 10. Sorulara doğru cevap verdiniz. 2., 3. ve 9. Sorulara
    yanlış cevap verdiniz.
  1. sorunun cevabı “e”, 3. Sorunun cevabı “b”, 9. sorunun cevabı “a” olmalıydı.
    Toplam puanınız: 70
    gibi bir sistem kursak ve hangi testi yaparsa yapsın bu sistem böyle devam etse . çok şey sordum çok şey istedim hakkını helal et böyle bir şey mümkün mü yapılırsa nasıl yapılır yardımcı olur musun rica etsem

Bu saydıklarınızın hepsi yapılabilir şeyler.

Bunun için while döngüsü kullanmanız gerekiyor. Konu hakkında daha fazla bilgiyi aşağıdaki bağlantıda bulabilirsiniz.

Şu anki durum öyle zaten?

Bahsettiğiniz bu yeni özellikleri koda eklemek mümkün. Nasıl yapacağınızı biraz okuma, biraz pratik yaparak zamanla siz de öğrenebilirsiniz. Bir anda bir çok istekte bulunuyorsunuz, kusuruma bakmayın bunları sizin adınıza yapmak demek size yardım etmek anlamına gelmiyor. Eğer bunları şu an nasıl yapacağınızı bilmiyorsanız, demek ki şu an böyle bir projeyi tam da istediğiniz gibi tasarlamak size zor geliyor. O zaman bu projeyi yapabilecek seviyeye gelene kadar bilginizi, deneyiminizi biraz daha artırmanız gerekiyor.

3 Beğeni