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:
- Du er deltaker i et spill (game show) der du st?r foran tre d?rer:
- Bak en av d?rene st?r en bil du ?nsker ? vinne, og bak de to andre d?rene st?r det en geit.
- Du velger en d?r, og merker at d?ren er l?st.
- Verten i spillet vet hva som er bak d?rene, og for ? gj?re ting litt enklere, ?pner han en annen d?r med en geit.
- Du st?r n? igjen med to d?rer, den du valgte og en annen. Bak en av dem er det alts? en bil, og bak den andre er det en geit.
- Du f?r n? muligheten til ? bytte d?r, eller fortsette med den du f?rst valgte.
- Hva b?r du gj?re? Hvor stor er sannsynligheten for ? f? tak i bilen i dette spillet? 50%? Har det noe ? si om du bytter d?r eller fortsetter med den f?rste du valgte?
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:
- Det kan bli litt tungvint om du representerer innholdet bak hver d?r med én variabel for hver d?r
- I stedet kan du f. eks representere d?rene som en liste:
dorer = ["geit", "bil", "geit"]
- Hvis du vil at innholdet skal v?re tilfeldig hver gang programmet kj?rer, kan du bruke shuffle-funksjonen:
- Importer f?rst random i toppen av filen din:
import random
Deretter kan du lage d?rene og "shuffle" dem:
dorer = ["geit", "bil", "geit"] random.shuffle(dorer)
Hvis du n? printer d?rene vil du se at innholdet stokkes rundt.
- Importer f?rst random i toppen av filen din:
- La gjerne brukeren velge et tall (0, 1 eller 2) slik at du kan hente ut innholdet p? den posisjonen i listen.
- Det blir fort en del if-elif-else setninger n? for ? sjekke d?ren og velge en annen d?r, men det er greit. Senere i kurset l?rer vi bedre m?ter ? l?se dette problemet p?.
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:
- Hvor ofte vinner man bilen hvis man alltid bytter d?r?
- Hvor ofte vinner man bilen hvis man alltid fortsetter med samme d?r som man f?rst valgte?
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.
- Lag en variabel
antall_seiere = 0
over for-l?ken. Denne ?nsker vi ? ?ke med 1 hver gang vi vinner. - I stedet for at prosedyren printer om man vant eller ikke, vil vi at prosedyren skal returnere om vi vant eller ikke.
- Endre prosedyren slik at det helt til slutt returneres enten "vant" eller "vant ikke":
# kode i prosedyren her ... if [sjekk for vurdere om spilleren vant]: return "vant" else: return "vant ikke"
- Endre prosedyren slik at det helt til slutt returneres enten "vant" eller "vant ikke":
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?