Python rastgele seçimlerde aynı ögeyi tekrar seçmemesini sağlamak

Merhaba. Kodlamayı ilk defa öğreniyorum.
Listemin içinden rastgele birisini seçmesini istediğim zaman aynı değeri tekrar seçebiliyor veya çok nadir seçim yapmıyor (boş satır). seçilen değerin tekrar seçilmesini istemiyorum. Birisi seçilmişse, diğer ögelerden birisini seçmesini istiyorum.

import random
for atılan_zar in range(2):
    zar = random.randint(1, 20)
    player_1 = 'Dayının'
    player_2 = 'Senin'
    oyuncular = [player_1,player_2]
    npc = random.choice(oyuncular)
    if zar <= 5:
        print(str(npc), 'Zar', str(zar),'Geldi :' + " Başarısız")
    elif zar <= 10:
        print(str(npc), 'Zar', str(zar),'Geldi :' + " Kötü")
    elif zar <= 15:
        print(str(npc), 'Zar', str(zar),'Geldi :' + " Fena Değil")
    elif zar < 19:
        print(str(npc), 'Zar', str(zar),'Geldi :' + " Başarılı")
    elif zar == 20:
        print(str(npc), 'zar', str(zar),'Geldi :' + " Mükemmel")

İlk başta tüm zar kombinasyonunu bir
listeye alın. Bu liste içinden rastgele
seçim yapın. Çıkan değeri listeden
silip yeniden rastgele seçim yapın.

1 Beğeni

Yanıtınız için teşekkür ederim. Henüz bir hevesle anlamaya çalışıyorum. çok saçma bir şeyin peşindeysem aydınlatın lütfen.
oyuncular listesinden seçim yapması için npc’i tanımladım. bu sayede devamında pratik bir hale gelir diye düşündüm. player_N eklerken değişen isimlerde kolaylık olsun diye oyuncular listesini bu şekilde oluşturdum. bu pratikliği kullanarak ‘npc’ öncesine, devamına yada altına ekleyebileceğim bir iki satırla bunu halletmem mümkün değil mi? random.choice elementleri birisi seçildiği zaman str(npc) kısaltmasıyla elenebilsin. bu sayede her if/elif işleminde fazladan bir satır girmekten kurtulayım.
yabancı forumlarda kafam iyice karıştı.

import random
###Listeyi döngüden önce tanımlıyoruz.Yoksa ekstra bir sürü ölçüt ve kod yazmak zorunda kalırız.Ayrıca her döngüde yeniden liste tanımlamaya gerek yok .
player_1='Dayının'
player_2='Senin'
oyuncular=[player_1, player_2]
for atılan_zar in range(2):
    zar = random.randint(1, 20)
    npc = random.choice(oyuncular)

    if zar <= 5:
        print(str(npc), 'Zar', str(zar),'Geldi :' + " Başarısız")
    elif zar <= 10 and zar>5:
        print(str(npc), 'Zar', str(zar),'Geldi :' + " Kötü")
    elif zar <= 15 and zar>10:
        print(str(npc), 'Zar', str(zar),'Geldi :' + " Fena Değil")
    elif zar <= 19 and zar>15:
        print(str(npc), 'Zar', str(zar),'Geldi :' + " Başarılı")
    else :
        print(str(npc), 'zar', str(zar),'Geldi :' + " Mükemmel")
    #### ilk seçilen npc yi listeden sildiren kod aşağıda.Böylelikle 2.zar atılışında sadece listede 1 eleman yani zar atmayan kalıyor.
    oyuncular.pop(oyuncular.index(npc))


If bloklarında da and kullanımına dikkat edin.Mantığını da anlamış olacaksınız.Kaldı ki paylaştığınız kodda zarın 19 gelme durumu belirtilmiyordu.Zar 19 geldiğinde print ekrana birşey döndürmüyordu.

1 Beğeni

Cevabınız için teşekkür ederim. Mantığı şimdi daha iyi kavradım.
“and” ve “or” kavramlarını okuyarak öğrenmiş ve test etmiştim.
Zarın 19 gelmesi durumunda ki durumu da düzelttim. Çalışan kod dizilimim aşağıda.

import random
player_1 = 'Mavi'
player_2 = 'Kırmızı'
player_3 = 'Sarı'
oyuncular = [player_1, player_2, player_3]
for atılan_zar in range(2):
    zar = random.randint(1, 20)
    npc = random.choice(oyuncular)
    oyuncular.pop(oyuncular.index(npc))
    if zar <= 5:
        print(npc, 'Zar',zar,'Geldi :' + " Başarısız")
    elif zar <= 10:
        print(npc, 'Zar',zar,'Geldi :' + " Kötü")
    elif zar <= 15:
        print(npc, 'Zar',zar,'Geldi :' + " Fena Değil")
    elif zar <= 19:
        print(npc, 'Zar',zar,'Geldi :' + " Başarılı")
    elif zar == 20:
        print(npc, 'zar',zar,'Geldi :' + " Mükemmel")