Ekstra oppgave (uke 3)

Dette er en ekstra oppgave for de som f?ler seg ferdig med stoffet fra uke 3, og har lyst p? litt mer utfordring og en liten smakebit p? uke 4.

Monty Hall Problem

Monty Hall Problem er et artig problem (g?te?), som g?r ut p? dette:

Tenk litt over problemet og sjekk at du forst?r det f?r du begynner p? oppgavene (men du trenger absolutt ikke ? l?se det f?r du begynner p? oppgavene).

L?sningsforslag

Det ligger et l?sningsforslag her. Merk at det er veldig mange ulike m?ter ? l?se denne oppgaven p? (spesielt oppgave 2), og at l?sningsforslaget er noks? langt. Ved hjelp av konsepter man l?rer etter uke 3 kan man l?se denne oppgaven enklere og mer elegant.

Her er et annet l?sningsforslag p? oppgave 2 med kompakt kode, sendt inn av alekshoi.

Oppgave 1: Implementer spillet

Lag en enkel versjon av spillet der en bruker blir bedt om ? velge mellom tre d?rer (ved hjel av input). Du kan kalle d?rene 1, 2 og 3. Spillet skal s? gi beskjed om at en av de andre d?rene ?pnes, og at du n? kan velge mellom de to som er igjen. Brukeren skal f? sp?rsm?l om ? bli eller bytte, og spillet skal til slutt gi beskjed om han vant en bil eller ikke.

Tips:

Oppgave 2: Kj?r spillet maange ganger

Ved hjelp av for-l?kker kan vi utf?re kode mange ganger.

Vi er n? interesserte i ? finne ut hvor ofte man vinner bilen om man spiller spillet mange ganger og gj?r konsekvente valg:

Oppgave 2a:

Putt koden fra oppgave 1 inn i en prosedyre. Kall prosedyren, og sjekk at spillet kj?rer som f?r.

def spill():
    # putt koden din her ...

# kall prosedyren og sjekk at ting virker

Oppgave 2b:

Vi ?nsker n? ? kj?re spillet tusenvis av ganger, og orker ikke ? skrive inn input hver gang.

Hvis du s?rger for ? ha tilfeldig plassering av bilen og geitene, b?r det ikke ha noe ? si hva personen velger i starten, s? vi kan droppe ? ta input for ? f? det f?rste valget. Endre i stedet det f?rste valget til ? v?re "hardkodet", bare sett valget til ? alltid v?re f. eks d?r 0.

Endre det andre valget til ? alltid v?re at vi fortsetter med samme d?r som vi initielt valgte (vi ?nsker ? se hva som skjer da).

S?rg for at det til slutt i prosedyren alltid printes hvorvidt man vant eller ikke. Unng? at det printes noe annet (vi ?nsker ikke s? mye output n?r spillet skal kj?res mange ganger).

Kj?r prosedyren og sjekk at det ikke kreves noe user-input, og at spillet kj?rer med de "hardkodede" valgene.

Oppgave 2c

Som vi skal l?re i uke 4, kan man kj?re kode mange ganger ved hjelp av en for l?kke. Den enkleste formen for for-l?kke ser slik ut:

for i in range(100):
    # kode som skal kj?re mange ganger her

Vi skal g? n?rmere inn p? hvordan denne l?kken fungerer i uke 4, men n? trenger du bare ? vite at alt som er inne i for-l?kken over blir kj?rt 100 ganger (merk tallet i 100 i range-funksjonen).

Lag en slik for-l?kke, og legg prosedyre-kallet inne i for-l?ken. Pass p? at koden inne i for-l?kken er indentert.

Kj?r programmet, og sjekk basert p? outputen at spillet kj?res mange ganger.

Hvor ofte ser det ut til at man vinner dersom man alltid endrer d?r? Endre slik at man alltid beholder samme d?r. Hvor ofte ser det ut til at man vinner da?

Oppgave 2d

Basert p? det som printes kan vi f? litt innsikt i hvor ofte man ser ut til ? vinne ved ? bytte eller beholde d?r, men vi har ikke noe eksakt tall p? det.

Vi ?nsker n? ? telle opp eksakt hvor ofte man vinner.

Prosedyren vil n? returnere en verdi, som vi kan f? tak i der prosedyren kalles. Vi kan deretter ?ke telleren basert p? denne verdien:

antall_seiere = 0
for i in range(100):
    returverdi = spill()
    if returverdi == "vant":
        antall_seiere += 1

print("Antall seiere:", antall_seiere)

Fors?k ? implementere dette. Hvor ofte ser man ut til ? vinne dersom man alltid bytter d?r? Hva om man alltid beholder d?ren man f?rst valgte? Stemmer dette med intuisjonen din?