R<span style="color: red">u</span>l<span style="color: red">e</span>t<span style="color: red">t</span>
Info til lærer
Dette opplegget er tenkt som en kobling mellom sannsynlighet og programmering. Elevene skal bygge et program som simluerer og regner ut sannsynligheter, med oppgaver som bruker sannsynlighetsregning, funksjonsdrøfting og regresjon. Opplegget kan brukes i både S1 og S2, men må endres noe for å passe til den gitte gruppen
Kompetansemål i S1
Mål for opplæringen er at eleven skal kunne
- bruke digitale verktøy til å simulere og utforske utfall i stokastiske forsøk, og forstå begrepet stokastiske variabler
- analysere et problem der sannsynlighet og kombinatorikk inngår, og bruke ulike strategier i problemløsingen
Kompetansemål i S2
Mål for opplæringen er at eleven skal kunne
- forstå begrepene forventningsverdi, varians og standardavvik, og bruke disse størrelsene til å tolke stokastiske variabler
- simulere utfall i, utforske og tolke ulike statistiske fordelinger, og gi eksempler på reelle anvendelser av disse fordelingene
Vi skal her se på hvilke beregninger som ligger bak når et kasino alltid vil gå med overskudd. Vi skal med andre ord simulere et kasino. Vi starter her med å se på spillet rulett der en kule etter hvert lander i et felt som blir vinnerfeltet. Det er to varianter av rulett, amerikansk (to grønne felter) og europeisk versjon (ett grønt felt), og vi kommer her til å bruke den europeiske versjonen som er vist på bildet under.
I rulett kan en enkel versjon av spillet være som følger:
- En spiller byr på en farge, et tall, eller en kombinasjon av de to
- Croupieren spinner hjulet i en retning og sender en kule rundt i motsatt retning
- Kulen mister fart og vil falle ned i en av plassene på ruletthjulet som gir vinnertallet
- Resultatet sjekkes mot alle veddemålene
K<span style="color: red">u</span>n <span style="color: red">e</span>t<span style="color: red">t</span> t<span style="color: red">a</span>l<span style="color: red">l</span>
Oppgave 1
Lag et program som tar inn et gjett fra brukeren, lager et tilfeldig tall fra tallene på ruletthjulet, sjekker om brukeren gjettet riktig, og skriver ut et svar til brukeren. I kodeblokken under har vi laget en start på programmet.
</div># Løs oppgave 1 her
from random import randint # laster inn biblioteket for å lage et tilfeldig tall
gjett = ???
utfall = randint(???)
if ???
print("???")
else:
print("???")
# Løsningsforslag til oppgave 1
from random import randint
gjett = int(input("Skriv inn gjettet ditt: "))
utfall = randint(0, 36) # kulen lander på et tilfeldig tall mellom 0 og 36
if utfall == gjett: # sjekker om vinnertallet er lik gjettet ditt
print("Du vant, kulen landet på", utfall)
else:
print("Du tapte, kulen landet på", utfall)
Oppgave 2
La alle i gruppen kjøre programmet minst 20 ganger. Noter antall ganger kjørt og antall ganger vunnet. Legg deretter sammen resultatene fra hele gruppen og regn ut den relative sannsynligheten for å vinne.
Det er ikke veldig morsomt å kun gjette på ett tall, så vi utvider koden vår til å kunne gjette på flere tall.
M<span style="color: red">a</span>n<span style="color: red">g</span>e <span style="color: red">t</span>a<span style="color: red">l</span>l
For å kunne satse på flere tall trenger vi å lage en liste over alle gjettene våre. Dette krever litt ekstra kode som ikke er nødvendig å lære seg (linje 5-8 i kodeboksen under).
from random import randint
gjett_string = input("Skriv inn gjettet ditt, hvis flere gjett skill dem av med mellomrom (for eksempel 12 15): ")
gjett_list = gjett_string.split() # her gjør vi gjettene om til en liste med tall (type str())
gjett = [] # Lager en ny liste der vi skal legge tallene
for i in gjett_list: # Går gjennom listen med tall (type str()) ...
gjett.append(int(i)) # ... og legger tall (type int()) inn i listen
utfall = randint(0, 36) # kulen lander på et tilfeldig tall mellom 0 og 36
if utfall in gjett: # sjekker vinnertallet er i tallene du gjettet på
print("Du vant, kulen landet på", utfall)
else:
print("Du tapte, kulen landet på", utfall)
Oppgave 3
a) Repeter oppgave 1, men med et fast antall gjett () hver gang (for eksempel at du gjetter tall hver gang). Regn ut den relative sannsynligheten for å vinne med gjett.
<br>b) Diskuter med gruppen hvordan dere tror den relative frekvensen vil endre seg ettersom øker.
<br>c) Diskuter med gruppen om man må velge de samme tallene hver gang i denne oppgaven (for eksempel tallene 1, 2, 3, 4 hver gang hvis ).
</div>Info til lærer
Oppgave 3 kan også gjøres interessant ved å la hver gruppe i klassen kjøre den for ulike antall kast. En gruppe får 3 gjett, en gruppe får 4 gjett, osv. Deretter kan man samle alle resultatene i en tabell og bruke regresjon for å finne likningen til utviklingen av den relative frekvensen.
Etter det er det flere spørsmål man kan diskutere:
- Hvilken likning burde den følge?
- Når er den gyldig?
- Gjelder den for alle tall?
Dette kan brukes som utgangspunkt for en felles diskusjon. Man kan også ta opp at funksjonen er diskret og ikke kontinuerlig, og plotte punkter i stedet for en kontinuerlig funksjon for en visuell forståelse.
F<span style="color: red">l</span>e<span style="color: red">r</span>e <span style="color: red">r</span>u<span style="color: red">n</span>d<span style="color: red">e</span>r
I lengden blir det kjedelig å kjøre programmet mange ganger, så vi legger til en løkke for å la ruletthjulet spinne for eksempel 10 ganger med det samme gjettet.
Oppgave 4
a) Utvid koden i kodeboksen under med en løkke som kjører 20 ganger (eller flere).
<br>b) Test koden og se om du får samme svar for den relative frekvensen du fikk i oppgave 3. Et løsningsforslag til kode er gitt lenger ned.
</div>from random import randint
gjett_string = input("Skriv inn gjettet ditt, hvis flere gjett skill dem av med mellomrom (for eksempel 12 15): ")
gjett_list = gjett_string.split() # her gjør vi gjettene om til en liste med tall (type str())
gjett = [] # Lager en ny liste der vi skal legge tallene
for i in gjett_list: # Går gjennom listen med tall (type str()) ...
gjett.append(int(i)) # ... og legger tall (type int()) inn i listen
n = ???
??????
utfall = randint(0, 36) # kulen lander på et tilfeldig tall mellom 0 og 36
if utfall in gjett: # sjekker vinnertallet er i tallene du gjettet på
print("Du vant, kulen landet på", utfall)
else:
print("Du tapte, kulen landet på", utfall)
Info til lærer
Oppgave 4 kan kortes ned til kun siste (b) oppgaven hvis man ikke vil at elevene skal rote seg bort med for-løkken. Det viktigste her er at de leker og utforsker.
# Løsningsforslag til oppgave 4<div class="alert alert-block alert-danger">
from random import randint
gjett_string = input("Skriv inn gjettet ditt, hvis flere gjett skill dem av med mellomrom (for eksempel 12 15): ")
gjett_list = gjett_string.split() # her gjør vi gjettene om til en liste med tall (type str())
gjett = [] # Lager en ny liste der vi skal legge tallene
for i in gjett_list: # Går gjennom listen med tall (type str()) ...
gjett.append(int(i)) # ... og legger tall (type int()) inn i listen
n = 20 # antallet runder med samme gjett
for i in range(n): # kjører ruletthjulet n ganger
utfall = randint(0, 36) # kulen lander på et tilfeldig tall mellom 0 og 36
if utfall in gjett: # sjekker vinnertallet er i tallene du gjettet på
print("Du vant, kulen landet på", utfall)
else:
print("Du tapte, kulen landet på", utfall)
L<span style="color: red">e</span>g<span style="color: red">g</span>e <span style="color: red">t</span>i<span style="color: red">l</span> f<span style="color: red">a</span>r<span style="color: red">g</span>e
Vi ønsker også å kunne vedde på hvilken farge kulen lander på, det vil si <span style="color: red">rødt</span> eller sort.
<img src="marihone.png" style="float: right;" width="400"/> <div class="alert alert-block alert-info">Oppgave 5
Hvorfor må vi ha and
mellom de to betingelsene i if-setningen i linje 29 og 31 i koden under?
Info til lærer
Oppgave 5 bør kanskje forklares nærmere siden de kanskje ikke har vært borti denne typen betingelser.
# Løsningsforslag til oppgave 5
from random import randint
gjett_string = input("Skriv inn gjettet ditt, hvis flere gjett skill dem av med mellomrom (for eksempel 12 15): ")
gjett_farge = input("Skriv inn fargen du vil gjette på, r for rødt og s for sort: ")
gjett_list = gjett_string.split() # her gjør vi om gjettene til en liste med tall.
gjett = []
for i in gjett_list: # splitter opp listen til en rekke med tall
gjett.append(int(i))
r = [1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36] # liste med de røde tallene
s = [2, 4, 6, 8, 10, 11, 13, 15, 17, 20, 22, 24, 26, 28, 29, 31, 33, 35] # liste med de sorte tallene
n = 20 # antallet runder med samme gjett
for i in range(n): # kjører ruletthjulet n ganger
print("========") # gjør utskrift av resultat litt penere
print("Runde", i+1)
print("========")
utfall = randint(0, 36) # kulen lander på et tilfeldig tall mellom 0 og 36
if utfall in gjett: # kommandoen "in" sjekker om utfallet er i mengden gjett
print("Du vant, kulen landet på", utfall)
else:
print("Du tapte, kulen landet på", utfall)
if utfall in r and gjett_farge == 'r': # sjekker om du gjettet på riktig farge
print("Det ble rødt, du vant!")
elif utfall in s and gjett_farge == 's':
print("Det ble sort, du vant!")
else:
print("Du gjettet ikke korrekt farge")
print()
# Løsningsforslag til oppgave 5
from random import randint
gjett_string = input("Skriv inn gjettet ditt, hvis flere gjett skill dem av med mellomrom (for eksempel 12 15): ")
gjett_farge = input("Skriv inn fargen du vil gjette på, r for rødt og s for sort: ")
gjett_list = gjett_string.split() # her gjør vi om gjettene til en liste med tall.
gjett = []
for i in gjett_list: # splitter opp listen til en rekke med tall
gjett.append(int(i))
r = [1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36] # liste med de røde tallene
s = [2, 4, 6, 8, 10, 11, 13, 15, 17, 20, 22, 24, 26, 28, 29, 31, 33, 35] # liste med de sorte tallene
n = 20 # antallet runder med samme gjett
for i in range(n): # kjører ruletthjulet n ganger
print("========") # gjør utskrift av resultat litt penere
print("Runde", i+1)
print("========")
utfall = randint(0, 36) # kulen lander på et tilfeldig tall mellom 0 og 36
if utfall in gjett: # kommandoen "in" sjekker om utfallet er i mengden gjett
print("Du vant, kulen landet på", utfall)
else:
print("Du tapte, kulen landet på", utfall)
if utfall in r and gjett_farge == 'r': # sjekker om du gjettet på riktig farge
print("Det ble rødt, du vant!")
elif utfall in s and gjett_farge == 's':
print("Det ble sort, du vant!")
else:
print("Du gjettet ikke korrekt farge")
print()
V<span style="color: red">e</span>d<span style="color: red">d</span>e <span style="color: red">p</span>e<span style="color: red">n</span>g<span style="color: red">e</span>r
For at dette skal simulere et kasino må vi også legge til et par ting til.
Oppgave 6
Diskuter med gruppen hvor mye mer informasjon vi trenger for at dette skal simulere et rulett-spill på et kasino?
</div>Info til lærer
Oppgave 6 er tenkt som gruppe-plenum diskusjon. Det vi i hvert fall trenger er:
- Legge til innsatser vi spiller for
- Hvor mye man vinner for enkelttall og farge
- Hva sannsynligheten for å vinne på både enkelttall og farge er
- Og selvsagt, alle de andre kategoriene man kan spille på. Dette kommer, men vi tar litt av gangen.
Oppgave 7
Koden under er nesten ferdig, men krever litt forklaring og litt utfylling.
<br>a) Les gjennom koden og diskuter med gruppen hva som skjer i hvert steg underveis. Dette er ikke store endringer fra koden over, men vi har lagt til noen linjer der vi ber om innsats for eksempel.
<br>b) Det er 6 steder i koden det står ???
(linje 31, 32, 38, 39, 42, 43). Hva kan stå her som spilleren tjener på? Hva bør stå her for at kasinoet skal tjene penger? Hva bør stå der for alle skal bli fornøyd?
from random import randint
gjett_string = input("Skriv inn gjettet ditt, hvis flere gjett skill dem av med mellomrom (for eksempel 12 15): ")
gjett_farge = input("Skriv inn fargen du vil gjette på, r for rødt og s for sort: ")
gjett_list = gjett_string.split() # her gjør vi om gjettene til en liste med tall.
gjett = []
for i in gjett_list: # splitter opp listen til en rekke med tall
gjett.append(int(i))
r = [1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36] # liste med de røde tallene
s = [2, 4, 6, 8, 10, 11, 13, 15, 17, 20, 22, 24, 26, 28, 29, 31, 33, 35] # liste med de sorte tallene
innsats = int(input("Hvor mye vil du vedde per gjett? "))
runde_innsats = innsats * (len(gjett) + 1) # total innsats per runde (ant tall du gjettet + 1 for rødt/sort)
saldo = 0 # din pengebeholdning ved start
vinn = 0
n = 10 # antallet runder med samme gjett
for i in range(n): # kjører ruletthjulet n ganger
print("========") # gjør utskrift av resultat litt penere
print("Runde", i+1)
print("========")
saldo = saldo - runde_innsats
utfall = randint(0, 36) # kulen lander på et tilfeldig tall mellom 0 og 36
if utfall in gjett: # kommandoen "in" sjekker om utfallet er i mengden gjett
print("Kulen landet på", utfall, "du vant", innsats * ???)
saldo = saldo + innsats * ???
vinn = vinn + 1
else:
print("Kulen landet på", utfall, "du tapte.")
if utfall in r and gjett_farge == 'r': # sjekker om du gjettet på riktig farge
print("Det ble rødt, du vant", innsats * ???)
saldo = saldo + innsats * ???
vinn = vinn + 1
elif utfall in s and gjett_farge == 's':
print("Det ble sort, du vant", innsats * ???)
saldo = saldo + innsats * ???
vinn = vinn + 1
else:
print("Du gjettet ikke korrekt farge")
print("Nå er saldoen din på:", saldo)
print()
print("Du gjettet", n, "ganger og vant", vinn, "ganger. Din fortjeneste ble", saldo)
# Løsningsforslag til oppgave 7
from random import randint
gjett_string = input("Skriv inn gjettet ditt, hvis flere gjett skill dem av med mellomrom (for eksempel 12 15): ")
gjett_farge = input("Skriv inn fargen du vil gjette på, r for rødt og s for sort: ")
gjett_list = gjett_string.split() # her gjør vi om gjettene til en liste med tall.
gjett = []
for i in gjett_list: # splitter opp listen til en rekke med tall
gjett.append(int(i))
r = [1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36] # liste med de røde tallene
s = [2, 4, 6, 8, 10, 11, 13, 15, 17, 20, 22, 24, 26, 28, 29, 31, 33, 35] # liste med de sorte tallene
innsats = int(input("Hvor mye vil du vedde per gjett? "))
runde_innsats = innsats * (len(gjett) + 1) # total innsats per runde (ant tall du gjettet + 1 for rødt/sort)
saldo = 0 # din pengebeholdning ved start
vinn = 0
n = 10 # antallet runder med samme gjett
for i in range(n): # kjører ruletthjulet n ganger
print("========") # gjør utskrift av resultat litt penere
print("Runde", i+1)
print("========")
saldo = saldo - runde_innsats
utfall = randint(0, 36) # kulen lander på et tilfeldig tall mellom 0 og 36
if utfall in gjett: # kommandoen "in" sjekker om utfallet er i mengden gjett
print("Kulen landet på", utfall, "du vant", innsats * 36)
saldo = saldo + innsats * 36
vinn = vinn + 1
else:
print("Kulen landet på", utfall, "du tapte.")
if utfall in r and gjett_farge == 'r': # sjekker om du gjettet på riktig farge
print("Det ble rødt, du vant", innsats * 2)
saldo = saldo + innsats * 2
vinn = vinn + 1
elif utfall in s and gjett_farge == 's':
print("Det ble sort, du vant", innsats * 2)
saldo = saldo + innsats * 2
vinn = vinn + 1
else:
print("Du gjettet ikke korrekt farge")
print("Nå er saldoen din på:", saldo)
print()
print("Du gjettet", n, "ganger og vant", vinn, "ganger. Din fortjeneste ble", saldo)
Oppgave 8
Kjør rulettprogrammet flere ganger og se om det virker rimelig. Vinner eller taper du oftest? Og hvor mye? Diskuter med gruppen hva som er forventet resultat.
</div>A<span style="color: red">v</span>a<span style="color: red">n</span>s<span style="color: red">e</span>r<span style="color: red">t </span>v<span style="color: red">a</span>r<span style="color: red">i</span>a<span style="color: red">n</span>t <span style="color: red">a</span>v <span style="color: red">r</span>u<span style="color: red">l</span>e<span style="color: red">t</span>t
I siste utvidelse til programmet skal vi nå se på mulighet for å simulere alle mulige måter å vedde på i rulett. Her kan du, i tillegg til å gjette på farge og tall, gjette på alle alternativene på brettet nedenfor:
Eksempel
Du bestemmer deg for å gjette på "lav" som er alle tall fra 1 - 18. Du vil også gjette på "r", som er alle de røde tallene. Innsatsen din er 10, og da vil det være 10 på både "lav" og "r".
</div>Oppgave 9
Koden under er også nesten ferdig, men vi mangler hvor mye vi skal vinne for hvert av de ulike gjettene. Diskuter med gruppen og fyll inn linje 23 - 35.
</div>from random import randint, choice # Tregner å velge fra en liste, henter kommandoen choice
gjett_liste = input('Skriv inn gjettet ditt. Ved flere valg, skill med mellomrom, eks: "12 s o rad2" ').strip().split(' ')
# Liste over alle alternativer på brett
gjett_valg = {'dusin1': list(range(1,13)),
'dusin2': list(range(13,25)),
'dusin3': list(range(25,37)),
'o': list(range(1,37,2)),
'p': list(range(0,37,2)),
'r': [1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36], # liste med de røde tallene
's': [2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35], # liste med de sorte tallene
'lav': list(range(1,19)),
'høy': list(range(19,37)),
'rad3': list(range(3,37,3)),
'rad2': list(range(2,37,3)),
'rad1': list(range(1,37,3))}
innsats = int(input("Hvor mye vil du vedde per gjett? "))
runde_innsats = innsats * len(gjett_liste) # total innsats per runde
saldo = 0 # din pengebeholdning ved start
gevinst = {'dusin1': ???, # gevinstoversikt (eksempel: 2 betyr 2*innsats)
'dusin2': ???,
'dusin3': ???,
'o': ???,
'p': ???,
'r': ???,
's': ???,
'lav': ???,
'høy': ???,
'rad3': ???,
'rad2': ???,
'rad1': ???,
'enkelttall' : ???}
n = 20 # antall runder med roulette
vinn = 0
print() # kun for pen utskrift
for i in range(n):
saldo = saldo - runde_innsats # oppdaterer saldoen for hver runde
utfall = randint(0, 36) # trekker vinnertallet for hver runde
treff = False # ved start har du ikke truffet på noen gjett enda
for gjett in gjett_liste: # sjekke utfall mot alle gjett
if gjett in gjett_valg.keys(): # hvis gjettet er et gyldig gjett ...
if utfall in gjett_valg[gjett]: # ... og hvis vinnertaller er i mengden med gjett du gjorde ...
saldo = saldo + (gevinst[gjett] * innsats) # ... vinner du et beløp avhengig av innsatsen din
vinn = vinn + 1
treff = True
elif int(gjett) == utfall: # ... eller hvis gjettet er et enkelttall
saldo = saldo + (gevinst['enkelttall'] * innsats) # ... vinner du et beløp avhengig av innsatsen din
vinn = vinn + 1
treff = True
if treff: # her skriver vi ut resultatet for hver runde
print("---VINN-- : kulen landet på", utfall)
else:
print("---TAP--- : kulen landet på", utfall)
print()
print("Du gjettet", n, "ganger og vant", vinn, "gang(er). Din fortjeneste ble", saldo, "kr.")
Oppgave 10
a) Kjør den ferdig kode flere ganger og se om dere kan finne ut hvor mye kasinoet tjener for hvert spill.
b) Regn ut ved hjelp av det du har lært i S2, hvor mye tjener et kasino per valg du gjør.
c) Søk på nettet for å finne hva et europeisk (ofte kalt fransk) kasino tjener per spill og sammenlig dette med svaret dere fikk i a) og b).
</div># Løsningsforslag til oppgave 9 og hele opplegget
from random import randint, choice # Trenger å velge fra en liste, henter kommandoen choice
gjett_liste = input('Skriv inn gjettet ditt. Ved flere valg, skill med mellomrom, eks: "12 s o rad2" ').strip().split(' ')
# Liste over alle alternativer på brett
gjett_valg = {'dusin1': list(range(1,13)),
'dusin2': list(range(13,25)),
'dusin3': list(range(25,37)),
'o': list(range(1,37,2)),
'p': list(range(0,37,2)),
'r': [1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36], # liste med de røde tallene
's': [2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35], # liste med de sorte tallene
'lav': list(range(1,19)),
'høy': list(range(19,37)),
'rad3': list(range(3,37,3)),
'rad2': list(range(2,37,3)),
'rad1': list(range(1,37,3))}
innsats = int(input("Hvor mye vil du vedde per gjett? "))
runde_innsats = innsats * len(gjett_liste) # total innsats per runde
saldo = 0 # din pengebeholdning ved start
gevinst = {'dusin1': 3, # gevinstoversikt (eksempel: 2 betyr 2*innsats)
'dusin2': 3,
'dusin3': 3,
'o': 2,
'p': 2,
'r': 2,
's': 2,
'lav': 2,
'høy': 2,
'rad3': 3,
'rad2': 3,
'rad1': 3,
'enkelttall' : 36}
n = 20 # antall runder med roulette
vinn = 0
print() # kun for pen utskrift
for i in range(n):
saldo = saldo - runde_innsats # oppdaterer saldoen for hver runde
utfall = randint(0, 36) # trekker vinnertallet for hver runde
treff = False # ved start har du ikke truffet på noen gjett enda
for gjett in gjett_liste: # sjekke utfall mot alle gjett
if gjett in gjett_valg.keys(): # hvis gjettet er et gyldig gjett ...
if utfall in gjett_valg[gjett]: # ... og hvis vinnertaller er i mengden med gjett du gjorde ...
saldo = saldo + (gevinst[gjett] * innsats) # ... vinner du et beløp avhengig av innsatsen din
vinn = vinn + 1
treff = True
elif int(gjett) == utfall: # ... eller hvis gjettet er et enkelttall
saldo = saldo + (gevinst['enkelttall'] * innsats) # ... vinner du et beløp avhengig av innsatsen din
vinn = vinn + 1
treff = True
if treff: # her skriver vi ut resultatet for hver runde
print("---VINN-- : kulen landet på", utfall)
else:
print("---TAP--- : kulen landet på", utfall)
print()
print("Du gjettet", n, "ganger og vant", vinn, "gang(er). Din fortjeneste ble", saldo, "kr.")