Bruk programmering til å simulere tilfeldige hendelser og estimere sannsynligheter.
Simulering av tilfeldige forsøk
Tenk deg at du vil finne ut sannsynet for å slå to seksarar med to terningar. Du kan rekne det ut teoretisk, men du kan òg simulere forsøket med eit dataprogram! Ved å la datamaskinen «kaste terningane» mange tusen gonger, kan vi estimere sannsynet.
Denne metoden vert kalla simulering, og ho er spesielt nyttig når det er vanskeleg å rekne ut sannsynet teoretisk. Datamaskinar er perfekte til dette — dei kan gjere millionar av forsøk på sekund.
I dette kapittelet skal du lære:
- Korleis du bruker random-modulen i Python til å lage tilfeldige tal
- Korleis du simulerer myntkast, terningkast og andre forsøk
- Korleis du samanliknar simulert og teoretisk sannsyn
- Kva lova om store tal tyder i praksis
Pythons random-modul lèt oss generere tilfeldige tal. For å bruke han skriv vi import random øvst i programmet.
Nyttige funksjonar:
import random
# Tilfeldig heiltal mellom a og b (inkludert begge)
terning = random.randint(1, 6)
# Tilfeldig desimaltal mellom 0 og 1
x = random.random()
# Velje tilfeldig frå ei liste
farger = ["rød", "blå", "grønn"]
valg = random.choice(farger)Kvar gong du køyrer programmet, får du (sannsynlegvis) ulike tal. Det er dette som gjer simulering mogleg — vi kan gjere eit tilfeldig forsøk mange gonger.
Når vi simulerer forsøk og ei hending inntreffer gonger, er det simulerte sannsynet:
Til dømes: Viss vi simulerer 10 000 terningkast og får seksar 1672 gonger, er det simulerte sannsynet for seksar:
Det teoretiske sannsynet er .
Jo fleire forsøk vi gjer, desto nærare kjem det simulerte sannsynet det teoretiske. Dette vert kalla lova om store tal.
Skriv eit Python-program som simulerer 10 000 kast med ein vanleg terning og finn det simulerte sannsynet for å slå ein seksar.
import random
antall_kast = 10000
antall_seksere = 0
for i in range(antall_kast):
kast = random.randint(1, 6)
if kast == 6:
antall_seksere = antall_seksere + 1
simulert = antall_seksere / antall_kast
teoretisk = 1 / 6
print(f"Antall seksere: {antall_seksere}")
print(f"Simulert sannsynlighet: {simulert:.4f}")
print(f"Teoretisk sannsynlighet: {teoretisk:.4f}")Typisk resultat:
Antall seksere: 1648
Simulert sannsynlighet: 0.1648
Teoretisk sannsynlighet: 0.1667Den simulerte verdien er nær den teoretiske , men ikkje eksakt lik. Køyrer vi programmet igjen, får vi eit litt anna svar. Med fleire kast (t.d. 1 000 000) kjem vi endå nærare.
Skriv eit Python-program som simulerer myntkast og finn det simulerte sannsynet for å få mynt (krone). Samanlikn med ulikt tal kast: 100, 1000, 10 000 og 100 000.
import random
for antall_kast in [100, 1000, 10000, 100000]:
antall_mynt = 0
for i in range(antall_kast):
kast = random.randint(0, 1) # 0 = krone, 1 = mynt
if kast == 1:
antall_mynt = antall_mynt + 1
simulert = antall_mynt / antall_kast
print(f"Kast: {antall_kast:>7} | P(mynt) = {simulert:.4f}")
print(f"Teoretisk: | P(mynt) = 0.5000")Typisk resultat:
Kast: 100 | P(mynt) = 0.4600
Kast: 1000 | P(mynt) = 0.5130
Kast: 10000 | P(mynt) = 0.4987
Kast: 100000 | P(mynt) = 0.5003
Teoretisk: | P(mynt) = 0.5000Legg merke til at det simulerte sannsynet svingar rundt 0,5, men svingingane vert mindre jo fleire kast vi gjer. Dette er eit døme på lova om store tal: Med mange nok forsøk nærmar det simulerte sannsynet seg det teoretiske.
Meir presist: Viss vi gjentek eit forsøk gonger, og hendinga inntreffer gonger, då gjeld:
I praksis tyder dette:
- Med 10 kast kan resultatet avvike mykje frå det forventa
- Med 1000 kast er avviket vanlegvis ganske lite
- Med 100 000 kast er avviket typisk svært lite
Lova om store tal er grunnen til at simulering fungerer som metode for å estimere sannsyn.
Samansette forsøk
Simulering er spesielt nyttig for samansette forsøk, der vi kombinerer fleire tilfeldige hendingar. Til dømes:
- Kaste to terningar og finne summen
- Trekkje kuler frå ein bolle utan tilbakelegging
- Spele eit spel med fleire rundar
For slike problem kan det vere vanskeleg å rekne ut sannsynet teoretisk, men simuleringa er enkel: Vi programmerer forsøket og gjentek det mange gonger!
Skriv eit Python-program som simulerer kast med to terningar og finn det simulerte sannsynet for at summen vert 7.
import random
antall_forsok = 100000
antall_sju = 0
for i in range(antall_forsok):
terning1 = random.randint(1, 6)
terning2 = random.randint(1, 6)
if terning1 + terning2 == 7:
antall_sju = antall_sju + 1
simulert = antall_sju / antall_forsok
print(f"Simulert P(sum = 7): {simulert:.4f}")
print(f"Teoretisk P(sum = 7): {6/36:.4f}")Typisk resultat:
Simulert P(sum = 7): 0.1664
Teoretisk P(sum = 7): 0.1667Teoretisk utrekning: Det er 6 gunstige utfall som gjev summen 7: . Med moglege utfall totalt, er sannsynet:
Simuleringa stadfestar dette!
Skriv eit Python-program som simulerer 1000 terningkast og tel kor mange gonger du slår kvart av tala 1 til 6. Skriv ut resultatet.
Skriv eit Python-program som simulerer 10 000 myntkast (der 0 = krone og 1 = mynt). Rekn ut og skriv ut det simulerte sannsynet for mynt. Samanlikn med det teoretiske sannsynet .
Skriv eit Python-program som simulerer kast med to terningar 100 000 gonger, og finn det simulerte sannsynet for at:
a) Summen er 2 (slangeauge)
b) Summen er 12 (to seksarar)
c) Summen er 7
Samanlikn med dei teoretiske sannsyna.
I ein bolle ligg det 5 raude og 3 blå kuler. Du trekkjer to kuler utan tilbakelegging. Skriv eit Python-program som simulerer dette forsøket 100 000 gonger og finn det simulerte sannsynet for å trekkje to raude kuler.
Hint: Lag ei liste med kulene og bruk random.sample(kuler, 2) for å trekkje to tilfeldige kuler.
Hint: Generer 23 tilfeldige tal mellom 1 og 365 (bursdagar). Sjekk om nokon tal er like.
Skriv eit Python-program som simulerer 100 000 rundar av Monty Hall-spelet og finn sannsynet for å vinne:
a) Viss du alltid behaldar valet
b) Viss du alltid byter dør
import random
antall_seksere = 0
for i in range(1000):
terning = random.randint(1, 5)
if terning == 6:
antall_seksere += 1
print(f"Antall seksere: {antall_seksere}")
print(f"Andel: {antall_seksere / 1000}")Når Marius køyrer programmet, får han alltid 0 seksarar. Finn feilen og forklar kva som gjekk gale.
Viss du simulerer 100 myntkast i Python, vil du alltid få nøyaktig 50 mynt og 50 kron.
Oppsummering
I dette kapittelet har du lært:
- random-modulen: Å bruke random.randint(), random.random() og random.choice() for å generere tilfeldige tal i Python
- Simulering: Å gjenta eit tilfeldig forsøk mange gonger med ein datamaskin for å estimere sannsyn
- Lova om store tal: At det simulerte sannsynet nærmar seg det teoretiske når talet på forsøk aukar
- Samansette forsøk: Å simulere komplekse situasjonar som to terningar, kuletrekking utan tilbakelegging og Monty Hall-problemet
Nøkkelomgrep
| Omgrep | Forklaring |
|---|---|
random.randint(a, b) | Genererer eit tilfeldig heiltal mellom og (inkludert begge) |
| Simulering | Å bruke ein datamaskin til å gjenta eit tilfeldig forsøk mange gonger |
| Simulert sannsyn | Talet på gunstige utfall delt på totalt tal forsøk: |
| Lova om store tal | Prinsippet om at simulert sannsyn nærmar seg det teoretiske ved mange forsøk |
random.sample() | Trekkjer tilfeldige element frå ei liste utan tilbakelegging |
| Bursdagsparadokset | Med 23 personar er det over 50 % sjanse for at to deler bursdag |
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.