Bruk programmering til å simulere tilfeldige hendelser og estimere sannsynligheter.
Simulering av tilfeldige forsøk
Tenk deg at du vil finne ut sannsynligheten for å slå to seksere med to terninger. Du kan beregne det teoretisk, men du kan også simulere forsøket med et dataprogram! Ved å la datamaskinen «kaste terningene» mange tusen ganger, kan vi estimere sannsynligheten.
Denne metoden kalles simulering, og den er spesielt nyttig når det er vanskelig å beregne sannsynligheten teoretisk. Datamaskiner er perfekte til dette — de kan gjøre millioner av forsøk på sekunder.
I dette kapittelet skal du lære:
- Hvordan du bruker random-modulen i Python til å lage tilfeldige tall
- Hvordan du simulerer myntkast, terningkast og andre forsøk
- Hvordan du sammenligner simulert og teoretisk sannsynlighet
- Hva store talls lov betyr i praksis
Pythons random-modul lar oss generere tilfeldige tall. For å bruke den skriver vi import random øverst i programmet.
Nyttige funksjoner:
import random
# Tilfeldig heltall mellom a og b (inkludert begge)
terning = random.randint(1, 6)
# Tilfeldig desimaltall mellom 0 og 1
x = random.random()
# Velge tilfeldig fra en liste
farger = ["rød", "blå", "grønn"]
valg = random.choice(farger)Hver gang du kjører programmet, får du (sannsynligvis) forskjellige tall. Det er dette som gjør simulering mulig — vi kan gjøre et tilfeldig forsøk mange ganger.
Når vi simulerer forsøk og en hendelse inntreffer ganger, er den simulerte sannsynligheten:
For eksempel: Hvis vi simulerer 10 000 terningkast og får sekser 1672 ganger, er den simulerte sannsynligheten for sekser:
Den teoretiske sannsynligheten er .
Jo flere forsøk vi gjør, desto nærmere kommer den simulerte sannsynligheten den teoretiske. Dette kalles store talls lov.
Skriv et Python-program som simulerer 10 000 kast med en vanlig terning og finner den simulerte sannsynligheten for å slå en sekser.
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 ikke eksakt lik. Kjører vi programmet igjen, får vi et litt annet svar. Med flere kast (f.eks. 1 000 000) kommer vi enda nærmere.
Skriv et Python-program som simulerer myntkast og finner den simulerte sannsynligheten for å få mynt (krone). Sammenlign med ulike antall 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 den simulerte sannsynligheten svinger rundt 0,5, men svingningene blir mindre jo flere kast vi gjør. Dette er et eksempel på store talls lov: Med mange nok forsøk nærmer den simulerte sannsynligheten seg den teoretiske.
Mer presist: Hvis vi gjentar et forsøk ganger, og hendelsen inntreffer ganger, da gjelder:
I praksis betyr dette:
- Med 10 kast kan resultatet avvike mye fra det forventede
- Med 1000 kast er avviket vanligvis ganske lite
- Med 100 000 kast er avviket typisk svært lite
Store talls lov er grunnen til at simulering fungerer som metode for å estimere sannsynligheter.
Sammensatte forsøk
Simulering er spesielt nyttig for sammensatte forsøk, der vi kombinerer flere tilfeldige hendelser. For eksempel:
- Kaste to terninger og finne summen
- Trekke kuler fra en bolle uten tilbakelegging
- Spille et spill med flere runder
For slike problemer kan det være vanskelig å beregne sannsynligheten teoretisk, men simuleringen er enkel: Vi programmerer forsøket og gjentar det mange ganger!
Skriv et Python-program som simulerer kast med to terninger og finner den simulerte sannsynligheten for at summen blir 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 beregning: Det er 6 gunstige utfall som gir summen 7: . Med mulige utfall totalt, er sannsynligheten:
Simuleringen bekrefter dette!
Skriv et Python-program som simulerer 1000 terningkast og teller hvor mange ganger du slår hvert av tallene 1 til 6. Skriv ut resultatet.
Skriv et Python-program som simulerer 10 000 myntkast (der 0 = krone og 1 = mynt). Beregn og skriv ut den simulerte sannsynligheten for mynt. Sammenlign med den teoretiske sannsynligheten .
Skriv et Python-program som simulerer kast med to terninger 100 000 ganger, og finner den simulerte sannsynligheten for at:
a) Summen er 2 (slangøyne)
b) Summen er 12 (to seksere)
c) Summen er 7
Sammenlign med de teoretiske sannsynlighetene.
I en bolle ligger det 5 røde og 3 blå kuler. Du trekker to kuler uten tilbakelegging. Skriv et Python-program som simulerer dette forsøket 100 000 ganger og finner den simulerte sannsynligheten for å trekke to røde kuler.
Hint: Lag en liste med kulene og bruk random.sample(kuler, 2) for å trekke to tilfeldige kuler.
Hint: Generer 23 tilfeldige tall mellom 1 og 365 (bursdager). Sjekk om noen tall er like.
Skriv et Python-program som simulerer 100 000 runder av Monty Hall-spillet og finner sannsynligheten for å vinne:
a) Hvis du alltid beholder valget
b) Hvis du alltid bytter 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 kjører programmet, får han alltid 0 seksere. Finn feilen og forklar hva som gikk galt.
Hvis 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 tall i Python
- Simulering: Å gjenta et tilfeldig forsøk mange ganger med en datamaskin for å estimere sannsynligheter
- Store talls lov: At den simulerte sannsynligheten nærmer seg den teoretiske når antall forsøk øker
- Sammensatte forsøk: Å simulere komplekse situasjoner som to terninger, kuletrekking uten tilbakelegging og Monty Hall-problemet
Nøkkelbegreper
| Begrep | Forklaring |
|---|---|
random.randint(a, b) | Genererer et tilfeldig heltall mellom og (inkludert begge) |
| Simulering | Å bruke en datamaskin til å gjenta et tilfeldig forsøk mange ganger |
| Simulert sannsynlighet | Antall gunstige utfall delt på totalt antall forsøk: |
| Store talls lov | Prinsippet om at simulert sannsynlighet nærmer seg den teoretiske ved mange forsøk |
random.sample() | Trekker tilfeldige elementer fra en liste uten tilbakelegging |
| Bursdagsparadokset | Med 23 personer 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.