Å simulere forsøk digitalt (regneark og programmering) og sammenligne med teoretisk sannsynlighet.
Den tredje veien til et svar
Så langt har vi hatt to veier til en sannsynlighet: regne den ut fra en modell, eller måle den med relative frekvenser fra virkelige data.
Den tredje veien er å la maskinen utføre forsøket for oss — tusener av ganger, på et sekund. Det kalles simulering, og det er grunnen til at mange problemer som var uoverkommelige for hundre år siden, er rutine i dag.
Simulering er ikke en erstatning for utregning. Den er et supplement som er uunnværlig når regnestykket blir for vanskelig, og et kontrollverktøy når du ikke er sikker på at utregningen din er riktig.
Begrunnelsen er store talls lov fra kapittel 4.1: med nok gjentakelser legger den relative frekvensen seg inntil sannsynligheten.
Framgangsmåten
Enhver simulering følger de samme fem skrittene, enten du bruker regneark eller programmering:
1. Bestem modellen. Hva er utfallene, og hvor sannsynlig er hvert av dem?
2. Simuler ett forsøk. Trekk tilfeldige tall etter modellen.
3. Avgjør om hendelsen inntraff. Skriv betingelsen som en test som gir sant eller usant.
4. Gjenta mange ganger og tell. Hold en teller over hvor mange ganger hendelsen inntraff.
5. Del på antall forsøk, og tolk svaret.
Skritt 1 er det viktigste — og det maskinen ikke kan gjøre for deg. Simuleringen måler den modellen du ga den, ikke virkeligheten. Er modellen gal, blir svaret galt uansett hvor mange forsøk du kjører.
Vi vil anslå sannsynligheten for at summen av to terninger blir minst 10. Beskriv en simulering i regneark, og sammenlign med den teoretiske verdien.
Skritt 1 — modellen. To terninger, hver med seks like sannsynlige utfall.
Skritt 2 — ett forsøk. I celle A1 og B1 legger vi ett terningkast hver:
A1: =TILFELDIGMELLOM(1;6)
B1: =TILFELDIGMELLOM(1;6)I C1 regner vi summen:
C1: =A1+B1Skritt 3 — testen. I D1 skriver vi 1 når hendelsen inntraff, og 0 ellers:
D1: =HVIS(C1>=10;1;0)Skritt 4 — gjenta og tell. Vi merker A1:D1 og drar nedover til rad 5000. Så teller vi:
F1: =SUMMER(D1:D5000)Skritt 5 — del og tolk.
F2: =F1/5000En kjøring gir typisk et tall rundt . Trykker vi F9, regnes arket om med nye tilfeldige tall, og vi får et litt annet tall hver gang — det er uvissheten i selve simuleringen.
Den teoretiske verdien. Summen blir minst 10 for parene
Det er 6 av de 36 utfallene:
Simuleringen treffer altså godt. Merk rekkefølgen her: vi kunne regnet det ut med en gang, og simuleringen var strengt tatt unødvendig. Poenget er at metoden virker på et problem vi kan kontrollere — da tør vi bruke den på problemer vi ikke kan kontrollere.
Svar: Simuleringen gir omtrent ; den teoretiske verdien er .
| Funksjon | Gjør |
|---|---|
=TILFELDIGMELLOM(1;6) | tilfeldig heltall fra 1 til 6 |
=TILFELDIG() | tilfeldig desimaltall mellom 0 og 1 |
=HVIS(vilkår;1;0) | 1 hvis vilkåret er sant, ellers 0 |
=SUMMER(område) | summen — altså antall treff når cellene er 1 og 0 |
=ANTALL.HVIS(område;">=10") | teller direkte uten hjelpekolonne |
Alle tilfeldige tall regnes om når arket oppdateres. Trykk F9 for å kjøre simuleringen på nytt.
Hvilken formel gir ett terningkast?
Skriv en formel i D1 som gir 1 når summen i C1 er nøyaktig 7, og 0 ellers.
Hva er den teoretiske sannsynligheten for sum 7? Oppgi forkortet brøk.
Hvor mange av de 2000 kastene venter du gir sum 7?
Trykk F9 fem ganger og noter anslaget hver gang. Beskriv hvor mye tallene varierer.
Simulering i Python
I et program blir de fem skrittene til fem linjer. Mønsteret er alltid det samme:
import random
antall = 100000 # hvor mange forsøk
treff = 0 # telleren
for i in range(antall):
# ett forsøk
# test om hendelsen inntraff
# øk telleren hvis den gjorde det
pass
print(treff / antall)Fordelen framfor regneark er at du kan kjøre langt flere forsøk, og at forsøket kan være mer sammensatt enn én rad med celler.
I et spill kaster du to terninger. Du vinner dersom minst én av dem viser 5 eller 6.
a) Skriv et program som anslår vinnersannsynligheten.
b) Bestem vinnersannsynligheten ved regning, og sammenlign.
a) Vi følger de fem skrittene.
import random
antall = 100000
treff = 0
for i in range(antall):
t1 = random.randint(1, 6)
t2 = random.randint(1, 6)
if t1 >= 5 or t2 >= 5:
treff = treff + 1
print(treff / antall)- random.randint(1, 6) er ett terningkast — skritt 2.
- if t1 >= 5 or t2 >= 5 er testen. or betyr «eller», og det er det inklusive «eller» fra kapittel 4.4: vinner du med begge, teller det også — skritt 3.
- treff = treff + 1 øker telleren. Legg merke til at ett likhetstegn tilordner en verdi; det er ikke en likning — skritt 4.
- Siste linje deler på antall forsøk — skritt 5.
Programmet skriver ut et tall rundt .
b) Vi regner med komplementet, slik kapittel 4.2 lærte oss. Det motsatte av «minst én viser 5 eller 6» er «ingen av dem viser 5 eller 6», altså at begge viser 1, 2, 3 eller 4.
For én terning:
Terningene er uavhengige, så vi ganger:
Simuleringen og utregningen stemmer overens. Da vet vi to ting: utregningen er trolig riktig, og programmet gjør trolig det det skal.
Svar: a) Et program som teller treff i 100 000 kast; det gir omtrent . b) .
Gjør det samme som i eksempel 2. I et annet spill kaster du tre terninger, og du vinner dersom minst én av dem viser sekser.
Skriv testlinja i programmet som avgjør om du vinner.
Bestem sannsynligheten for at én terning ikke viser sekser. Oppgi forkortet brøk.
Bestem sannsynligheten for at ingen av de tre viser sekser. Oppgi som brøk.
Bestem vinnersannsynligheten. Oppgi som brøk.
Skriv vinnersannsynligheten som desimaltall med tre desimaler.
Å lese andres simuleringsprogram
En vanlig eksamensoppgave gir deg et ferdig program og spør hvilken sannsynlighet det regner ut. Framgangsmåten er å lese programmet i to omganger:
Først komponentene, linje for linje: hva er konstantene, hva trekkes tilfeldig, hva er testen, hva telles, hva skrives ut?
Så flyten, altså hva som skjer når programmet kjører: følg to gjennomløp av løkka og hold styr på hva hver variabel inneholder etter hvert skritt. Deretter «og så videre» for resten.
Nøkkelen ligger nesten alltid i testlinja. Den forteller nøyaktig hvilken hendelse programmet teller.
Forklar hvilken sannsynlighet programmet under anslår, og hvorfor simulering er et rimelig valg her.
import random
n = 200000
teller = 0
for i in range(n):
p = 1
for k in range(3):
p = p * random.randint(1, 6)
if p > 100:
teller = teller + 1
print(teller / n)Komponentene:
- n = 200000 er antall forsøk, og teller = 0 er telleren. Begge settes før løkka begynner.
- Den ytre løkka for i in range(n) gjentar hele forsøket 200 000 ganger.
- p = 1 nullstiller — eller rettere, én-stiller — produktet foran hvert forsøk. Det må stå inne i den ytre løkka; sto det utenfor, ville produktet vokst gjennom alle forsøkene.
- Den indre løkka for k in range(3) kjører tre ganger. Hver gang ganges p med et nytt terningkast. Etter tre runder er p produktet av tre terningkast.
- if p > 100 er testen: er produktet større enn 100?
- teller = teller + 1 øker telleren når testen slår til.
- print(teller / n) skriver ut andelen — altså anslaget.
Flyten, to gjennomløp:
Første gjennomløp av den ytre løkka. p settes til 1. Indre løkke: si at terningene gir 4, 6 og 5. Da blir p først , så , så . Testen slår til, og teller blir 1.
Andre gjennomløp. p settes til 1 igjen. Si at terningene gir 2, 3 og 6. Da blir p , så , så . Testen slår ikke til, og teller står stille på 1.
Og så videre, 200 000 ganger. Til slutt deles telleren på 200 000.
Hvilken sannsynlighet? Programmet anslår
Hvorfor simulering? Utfallsrommet har utfall, og det finnes ingen enkel formel for hvor mange av dem som gir produkt over 100 — vi måtte gått gjennom alle 216 og telt. Det lar seg gjøre, men det er tungvint for hånd. Simuleringen gir svaret på et sekund, og gir dessuten en metode som fortsatt virker om vi går opp til fire eller fem terninger, der opptellingen blir uoverkommelig.
Svar: Programmet anslår sannsynligheten for at produktet av tre terningkast blir større enn 100.
import random
n = 50000
teller = 0
for i in range(n):
kort = random.sample(range(1, 53), 5)
hoy = 0
for k in kort:
if k > 48:
hoy = hoy + 1
if hoy >= 1:
teller = teller + 1
print(teller / n)Kortene er nummerert 1 til 52, og de fire essene har numrene 49, 50, 51 og 52.
Hva gjør random.sample(range(1, 53), 5)?
Hva teller variabelen hoy?
Hvilken sannsynlighet anslår programmet?
Hvordan måtte testlinja if hoy >= 1: endres for å anslå sannsynligheten for nøyaktig ett ess?
Bestem sannsynligheten for at ingen av de fem kortene er ess, ved regning. Svar med tre desimaler.
Hvor nøyaktig er en simulering?
Et simuleringssvar er en måling, ikke en fasit. To kjøringer av samme program gir ulike tall, og forskjellen er ikke en feil — den er uvissheten.
Den viktigste regelen å huske er denne:
For å halvere usikkerheten må du firedoble antall forsøk.
Grunnen er at usikkerheten synker som : firedobler du , dobles , og usikkerheten halveres. Det betyr at de første tusen forsøkene gir mye, mens de neste hundre tusen gir stadig mindre igjen for arbeidet.
Derfor skal du aldri oppgi et simuleringssvar med flere desimaler enn simuleringen kan bære. Har du kjørt 1000 forsøk, er «0,3427» en påstand du ikke har dekning for; «omtrent 0,34» er ærlig.
Figuren over viser 10 000 simulerte kast med to terninger sammenlignet med de teoretiske sannsynlighetene.
a) Hvorfor er søylene høyest i midten?
b) Det største avviket mellom simulert og teoretisk andel er . Er det stort eller lite?
c) Hvor mange kast måtte vi kjørt for å halvere det typiske avviket?
a) Fordi summene i midten kan oppnås på flest måter. Sum 7 kan komme av 6 av de 36 tallparene, mens sum 2 bare kan komme av ett — nemlig .
Dette er det samme poenget som i kapittel 4.3: de 11 summene er ikke like sannsynlige, selv om de 36 parene er det.
b) Det er lite. Avviket skal sammenlignes med selve sannsynligheten det gjelder, . Det tilsvarer omtrent 5 % av verdien, og en simulering på 10 000 forsøk kan ikke love bedre enn dette.
En nyttig målestokk: med 10 000 forsøk ligger det typiske avviket i størrelsesorden . Vårt største avvik er altså akkurat der man skulle vente.
c) Usikkerheten synker som . Skal den halveres, må dobles, og da må firedobles:
Svar: a) Fordi de midtre summene kan oppnås på flere måter. b) Lite — det er i den størrelsesorden 10 000 forsøk gir. c) 40 000 kast.
Om usikkerheten i en simulering.
En simulering med 2500 forsøk gir anslaget 0,384. Omtrent hvor stort er det typiske avviket, regnet som ? Svar med to desimaler.
Hvor mange forsøk trengs for å halvere avviket i a)?
Hvor mange forsøk trengs for å gjøre avviket ti ganger mindre enn i a)?
En elev skriver «simuleringen gir 0,38400». Hva er galt med svaret?
Hvordan bør svaret i d) i stedet skrives?
Oppsummering
- Simulering utfører forsøket mange ganger digitalt og bruker den relative frekvensen som anslag. Begrunnelsen er store talls lov.
- Framgangsmåten er fem skritt: modell, ett forsøk, test, gjenta og tell, del og tolk.
- Simuleringen måler modellen du ga den. Er modellen gal, hjelper ikke flere forsøk.
- I regneark: TILFELDIGMELLOM, HVIS og SUMMER, og F9 for ny kjøring. I Python: en løkke med en teller.
- Når du leser andres program: finn testlinja — den sier hvilken hendelse som telles. Følg deretter to gjennomløp av løkka.
- Et simuleringssvar er en måling med usikkerhet. Firedobling av halverer usikkerheten, og svaret skal ikke oppgis med flere desimaler enn det kan bære.
- Bruk simulering til å kontrollere en utregning du er usikker på — og til å svare når utregningen er for vanskelig.
Hvor mange utfall har utfallsrommet for fire kast?
Bestem sannsynligheten for at alle fire viser kron. Oppgi forkortet brøk.
Programmet kjører 80 000 forsøk. Omtrent hvor mange treff venter du?
En kjøring gir 5043 treff. Regn ut anslaget med fire desimaler, og sammenlign med b).
En annen kjøring gir 12 000 treff. Hva bør du mistenke?
Skriv linja som trekker de 15 loddene idrettslaget kjøper, når loddene er nummerert 1 til 200 og gevinstloddene har numrene 1 til 8.
Skriv testlinja som avgjør om laget fikk minst én gevinst.
Bestem sannsynligheten for at laget ikke får noen gevinst, ved regning. Svar med tre desimaler.
Bestem sannsynligheten for minst én gevinst. Svar med tre desimaler.
Laget vurderer å kjøpe 30 lodd i stedet. Blir sannsynligheten for minst én gevinst dobbelt så stor? Regn ut og forklar.
Er antakelsen om at bygningene skades uavhengig av hverandre, rimelig ved storm? Begrunn.
Hvilken vei vil denne antakelsen trekke anslaget — for høyt eller for lavt?
Hjelper det å øke fra 10 millioner til 100 millioner simulerte år?
Hva kunne selskapet gjort for å forbedre modellen?
Formuler en generell lærdom om simulering ut fra dette.
Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.
