Vinnaren i pepparkakshustävlingen!
2018-04-25, 12:56
  #1
Medlem
Jag försöker lära mig Python och har utmanat mig själv att skriva ett program som testar Monty Hall-problemet empiriskt vid fler dörrar än tre och där Monty Hall också kan öppna fler dörrar än en. Det är två dagar sedan jag började lära mig python, så det finns en massa som jag inte kan, och jag antar att man kan kritisera mycket av koden. Jag började med att simulera det ursprungliga problemet och håller på att bygga ut koden för att simulera fler dörrar, så därför kanske det är lite stökigt och ologiskt.
Hur som helst:
När jag kör koden i IDLE så "stannar" allt när jag vill göra mer än ett försök (fast inte varje gång), och jag antar att det är på grund av att jag klantat mig med for-looparna på raderna 55 och 57, men jag fattar inte vad jag gjort fel... Traceback ger lite olika svar varje gång när jag avbryter med ctrl+c.
Någon som ser vad jag gjort för fel? (Och som vet hur jag ska göra för att kunna kopiera in kod utan att det blir radbrytningar som det blir på tre ställen i koden nedan?)

Kod:
#Testar empiriskt om det är bäst att byta dörr eller behålla den ursprungliga med fler dörrar än tre
#Importera moduler som behövs
import random

igen = 'j'

while igen == 'j':

    #Räkna ut och visa resultaten
    def resultat():
        print ('Antal vinster ' + str(win) + ' Antal förluster ' + str(lose) + ' Vinstprocent = {:.2%}'.format(win/(lose + win)))
    #Välj dörr
    def chooseDoor():
        choice = random.randint(1,doors)
        return choice
    #Monty öppnar dörr
    def fakeOpen():
        fake = random.randint(1,doors)
        return fake

    
    #Nollställ resultaten
    win = 0
    lose = 0
    val = 0
    prize = 0
    elim = []
    monty = 0
    antal = 0
    
    #Fråga hur många dörrar
    print('Hur många dörrar?')
    doors = int(input())
    
    #Bestäm bakom vilken dörr priset är
    prize = random.randint(1,doors)
    
    #Fråga hur många dörrar Monty ska öppna
    print('Hur många dörrar ska Monty öppna?')
    monty = int(input())
    while monty > doors -2:
        print('För många, max ' + str(doors - 2))
        monty = int(input())
    
    #Fråga hur många försök som ska göras
    print('Hur många försök?')
    antal = int(input())
    
    #Bestäm att behålla eller byta dörr
    print('1. För att byta dörr 2. för att behålla')
    method = int(input())
    
    #Testa att byta dörr
    if method == 1:
        for i in range(antal):
            val = chooseDoor()
            for j in range(monty):
                montelim = fakeOpen()
                while montelim == val or montelim == prize or montelim in elim:
                    montelim = fakeOpen()
            elim = elim + [montelim]
            val2 = chooseDoor()
            while val2 in elim or val2 == val:
                val2 = chooseDoor()
            if val2 == prize:
                win = win + 1
            else:
                lose = lose + 1
        resultat()
        print('Förväntad vinstprocent = ' + str(round(100 * (1/doors) * ((doors-1) / (doors - monty - 1)))) + '%')
    
    #Testa att stå kvar
    if method == 2:
        for i in range(antal):
            val = chooseDoor()
            if val == prize:
                win = win + 1
            else:
                lose = lose + 1
        resultat()
        print('Förväntad vinstprocent = ' + str(round(100 / doors)) + '%')
    print('Tryck "j" för att försöka igen')
    igen = input()
Citera
2018-04-25, 20:06
  #2
Moderator
vhes avatar
Om du gör multipla försök så fortsätter du fylla på listan elim, och den kommer slutligen att innehålla samtliga dörrar. Den behöver rensas mellan varje försök, på rad 56 ungefär, dvs det första som händer i loopen över antal när användaren valt metod 1.

Lite print-satser här och var där du skrev ut innehåll i olika variabler hade hjälpt dig se att det var det, skulle jag tro :-)
Citera
2018-04-25, 23:09
  #3
Medlem
Det löste det hela! (Plus att jag kom på att jag glömt göra ett indrag på den raden som lagrar värden i listan elim så den kom inte in i rätt loop...)
Stort tack för hjälpen!
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback