Python 3 Türen Spiel programmieren?
Ich hab zwar schon ein funktionierendes Programm aber ich verstehe es nicht 100% hat jemand eine einfachere Variante?
import random
# Eingabe
anz_sim = int(input('Wie viele Simulationen?'))
anz_gewinn = 0
wahl2 = 0
for i in range(1,anz_sim+1):
türen = []
# Preis verstecken
while len(türen) < 3:
preis = random.randint(1,3)
if preis not in türen:
türen += [preis]
niete = random.randint(1,3)
if niete not in türen:
türen += [niete]
print('Preis:',türen[0])
# Kandidat wählt Tür
wahl = random.randint(1,3)
print('1.Wahl',wahl)
# Showmaster öffnet Tür mit Niete
if wahl == türen[2]:
print('Geöffnet wurde:', türen[1])
del türen[1]
elif wahl == türen[1]:
print('Geöffnet wurde:', türen[2])
del türen[2]
elif wahl == türen[0]:
print('Geöffnet wurde:', türen[2])
del türen[2]
# Kandidat kann neu wählen
while wahl2 not in türen:
wahl2 = random.randint(1,3)
print('wahl2:',wahl2)
wahl = wahl2
print('2. Wahl:',wahl)
# Gewinn hochzählen
if wahl == türen[0]:
anz_gewinn +=1
print('Gewonnen')
print('--------')
# Ausgabe
print('Anzahl Simulationen:', anz_sim)
print('Preise gewonnen:', anz_gewinn)
print('Prozent gewonnen:',(anz_gewinn / anz_sim) *100,'%')
1 Antwort
Für den Kern der Simulation hätt ich das hier:
import random
PREIS=1
NIETE=0
def simulation(wechseln = False):
#Türen initialisieren
tueren = [PREIS, NIETE, NIETE]
#Türen durchmischen
random.shuffle(tueren)
#Eine Türposition wählen
wahl = random.randint(0,2)
#Türpositionen auflisten und die gewählte Türposition entfernen
rest = [0,1,2]
rest.remove(wahl)
#Falls die Tür mit dem Preis nicht die gewählte ist, wird sie jetzt aus der Restmenge entfernt
if tueren[wahl] != PREIS: rest.remove(tueren.index(PREIS))
#Der Moderator wählt eine der Türen aus der Menge der Türen, die weder vom Kanidaten gewählt wurden, noch den Preis verbergen und öffnet diese
oeffnen = random.choice(rest)
rest.remove(oeffnen)
#Zur Restmenge der Türen wird jetzt die mit dem Preis wieder hinzugefügt
rest.append(tueren.index(PREIS))
#Falls der Kanidat die Tür wechselt, bleibt jetzt nur noch die erste der übrigen Türen übrig
if wechseln: wahl = rest[0]
#Rückgabe eines bool-Wertes, der besagt, ob die am Ende gewählte Tür die mit dem Preis ist oder eben nicht
return tueren[wahl] == PREIS
Für n Simulationen einfach n-mal durchlaufen lassen und am Ende zählen, wie Oft True bzw. False zurückgegeben wurde.
Anwendungsbeispiel:
anzahl = 100
gewonnen = sum([int(simulation(True)) for i in range(anzahl)])
print('Mit Türwechsel: {0}/{1}'.format(gewonnen, anzahl))
gewonnen = sum([int(simulation(False)) for i in range(anzahl)])
print('Ohne Türwechsel: {0}/{1}'.format(gewonnen, anzahl))