Terningkast med Scratch

På denne siden skal vi se hvordan vi kan bruke Scratch (scratch.mit.edu/projects/editor/ Links to an external site.) til å simulere terningkast.

Vi forutsetter kjennskap til løkker, aritmetiske operatorer, sammenlikningsoperatorer, logiske operatorer, variabler, vilkår, forgreininger og innlesing i Scratch.

Som mange andre programmeringsspråk har Scratch en mekanisme til å generere tilfeldige tall. Siden en datamaskin kan gjøre beregninger svært fort, vil vi med en slik mekanisme kunne simulere et stort antall tilfeldige hendelser på kort tid, og derved bruke simuleringer til å kjapt anslå sannsynligheter rimelig godt. Nøyaktig hvor raskt avhenger av datamaskinen, men per mai 2024 genererer og summerer Scratch 1 000 000 tilfeldige heltall på 0,6 sekunder.

I Scratch genererer vi tilfeldige tall med klossen "tilfeldig tall fra … til …": Kloss som genererer tilfeldige tall. Denne klossen genererer uniformt fordelt tall fra og med tallet vi skriver inn i det første feltet, til og med tallet vi skriver inn i det andre feltet. Hvis begge tallene er heltall, genererer klossen heltall. Hvis ett eller begge tallene er desimaltall, genererer klossen desimaltall. Siden vi på denne siden skal simulere terningkast, og en terning kan gi øyne 1, 2, 3, 4, 5 og 6, kommer vi til å skrive inn heltallene 1 og 6.

Kaste 1 terning

Noe av det enkleste vi kan gjøre, er å telle opp hvor mange kast med en enkelt terning som gir et bestemt resultat.

Eksempel 1:

Klossen under teller opp og lar katten si hvor mange av 1 000 000 simulerte terningkast som blir sekser.

Vi lager først en variabel vi har kalt antall, til å holde rede på hvor mange simuleringer som gir sekser.

Klossen starter så med å sette antall til 0, siden vi i utgangspunktet ikke har gjort noen kast som ga sekser. Deretter går vi inn i ei løkke som gjentas 1 000 000 ganger. For hvert gjennomløp av løkka genererer vi så et tilfeldig tall mellom 1 og 6. Hvis tallet er 6, øker vi verdien til antall med 1. Etter løkka lar vi så katten si verdien til antall, altså det totale antall seksere.

Kloss som simulerer 1 000 000 terningkast og teller seksere

Når vi klikker på klossen i eksempel 1, varierer det noe fra gang til gang hva katten sier, men resultatet ser ut til å ligge noe i nærheten av 167 000. Det er rimelig, fordi sannsynligheten for å få sekser i et terningkast er 16, så forventet antall seksere er 10000006166666.

Øvingsoppgave 1:

Bygg en kloss som gjør 1 000 000 simulerte terningkast, og teller opp og lar katten si hvor mange kast som blir enere. Vurder om resultatet er rimelig.

Vi kan enkelt utvide klossen fra eksempel 1 slik at katten sier den simulerte sannsynligheten for å få sekser i stedet for bare antallet seksere. Denne sannsynligheten beregner vi ved å bruke prinsippet om gunstige på mulige, slik som vist i eksempel 2.

Eksempel 2:

Klossen under beregner og lar katten si den simulerte sannsynligheten for å få sekser i et terningkast.

Hovedstrukturen er den samme som i eksempel 1, med en opptelling av hvor mange av 1 000 000 simulerte terningkast som blir sekser. Men i stedet for at katten sier antall seksere, sier den antall seksere dividert på 1 000 000, det vil si antall gunstige utfall dividert på antall mulige utfall.

For å gjøre logikken tydeligere kaller vi variabelen som teller antall seksere, for gunstige, og vi lager også en variabel, mulige, som vi setter til 1 000 000.

Det er en utfordring at katten bare tar med 2 desimaler i tall den sier, men det viser seg at den den tar med flere hvis vi bruker en "sett sammen"-kloss til å kombinere tallet med en tekst. Så vi setter på strengen "Sannsynlighet: ".

Klossen er vist under.

Kloss som simulerer 1 000 000 terningkast og beregner sannsynlighet for sekser

Når vi klikker på klossen i eksempel 2, varierer det noe fra gang til gang hva katten sier, men resultatet ser stort sett ut til å ligge i nærheten av 0,167. Det er rimelig, fordi den teoretiske sannsynligheten for å få sekser i et terningkast er 160,167.

Kaste 2 terninger

Siden sannsynlighetene for å få 1, 2, 3, 4, 5 eller 6 alle er 16, er det begrenset hvor mye vi kan få ut av å simulere kast med en enkelt terning. Utvider vi til å simulere to terninger, kan vi imidlertid gjøre mer spennende undersøkelser.

For å simulere et kast med to terninger bruker vi "tilfeldig tall fra … til …"-klossen to ganger. Vil vi for eksempel simulere summen av øyne på to terninger, kan vi sette sammen to "tilfeldig tall fra … til …"-klosser ved hjelp av en sum-kloss, slik: Kloss som simulerer sum av to terninger. NB! Dette er ikke det samme som "tilfeldig tall fra 1 til 12", som vil gi en uniform fordeling av tallene mellom 1 og 12.

Vil vi for eksempel simulere sannsynligheten for å få sum tre i kast med to terninger, kan vi modifisere klossen fra eksempel 2 som vist i eksempel 3.

Eksempel 3:

Klossen under beregner og lar katten si sannsynligheten for å få sum tre i kast med to terninger, basert på 1 000 000 simuleringer. Strukturen er den samme som i eksempel 2, det er bare vilkåret i "hvis"-klossen som er endret.

Kloss som simulerer 1 000 000 terningkast og beregner sannsynlighet for sum 3 på to terninger

Når vi klikker på klossen i eksempel 3, varierer det noe fra gang til gang hva katten sier, men resultatet ser stort sett ut til å ligge i nærheten av 0,055. Det finnes totalt 36 forskjellige mulige utfall av kast med to terninger, fra 1-1 til 6-6. Av disse er det 2 som gir sum tre, nemlig 1-2 og 2-1. Gunstige på mulige gir derfor at den teoretiske sannsynligheten for å få sum tre er 2360,055.

Det vil naturligvis være interessant å undersøke sannsynligheten for andre summer i kast med to terninger. For å gjøre dette på en praktisk måte, skal vi la brukeren angi hvilken sum det skal simuleres sannsynlighet for. Det lar vi være en øvingsoppgave.

Øvingsoppgave 2:

Ta utgangspunkt i klossen i eksempel 3, og bygg på slik at katten spør etter hvilken sum brukeren vil simulere sannsynligheten for. Ta en titt på siden Lese inn fra bruker i Scratch hvis du ikke husker hvordan du gjør det.

Test med å lese inn 4. Sannsynligheten bør da bli om lag 0,083 fordi det finnes 3 utfall som gir sum fire, nemlig 1-3, 2-2 og 3-1. Gunstige på mulige gir derfor at den teoretiske sannsynligheten for å få sum fire er 3360,083.

Med to terninger kan det også være interessant å simulere sannsynligheten for at minst én terning gir sekser i kast med to terninger.

Da bruker vi samme strukturen som eksempel 3, men lager to sjekker på om en "tilfeldig tall fra … til …"-kloss gir 6, og knytter dem sammen med en "eller"-kloss. Da regner vi en simulering som gunstig hvis enten den ene eller den andre "tilfeldig tall fra … til …"-klossen gir sekser.

Eksempel 4:

Klossen under beregner og lar katten si sannsynligheten for å få minst en sekser i kast med to terninger, basert på 1 000 000 simuleringer. Strukturen er den samme som i eksempel 3, det er bare vilkåret i "hvis"-klossen som er endret.

Kloss som simulerer 1 000 000 terningkast og beregner sannsynlighet for minst en sekser i kast med to terninger

Når vi klikker på klossen i eksempel 4, varierer det noe fra gang til gang hva katten sier, men resultatet ser stort sett ut til å ligge i nærheten av 0,305. Det er fornuftig for den teoretiske sannsynligheten er sannsynligheten for sekser på den ene terningen pluss sannsynligheten for sekser på den andre terningen minus sannsynligheten for sekser på begge, 16+16136=11360,305.

Øvingsoppgave 3:

Ta utgangspunkt i klossen i eksempel 4, men modifiser den slik at den simulerer sannsynligheten for å få sekser på begge terningene samtidig. Vurder om resultatet er fornuftig i forhold til den teoretiske sannsynligheten.

Simulering med to terninger kan utvides til tre eller flere terninger, men det overlater vi til den enkelte å utforske selv.

Registrere flere resultater samtidig

Dette avsnittet forutsetter kjennskap til lister, i tillegg til de andre mekanismene i Scratch som vi nevnte innledningsvis.

I eksempel 1 simulerte vi 1 000 000 terningkast, og registrerte hvor mange kast som ga sekser. Kastene som ikke ga sekser, gjorde vi imidlertid ikke noe med. Det vil si at vi ikke benyttet om lag fem sjettedeler av kastene til noe. Men det kan jo vært interessant å også telle opp hvor mange kast som gir ener, toer, og så videre. Vi trenger da seks variabler til å telle de seks mulige resultatene, men seks enkeltvariabler vil være uoversiktlig og tungvint. Vi skal derfor i stedet bruke ei liste med seks elementer. De tilfeldige tallene vi genererer, bruker vi som indekser i lista. Får vi 1, øker vi verdien til element nummer 1 med 1, Får vi 2, øker vi verdien til element nummer 2 med 1, og så videre. Lister er dessverre ganske tungvint å håndtere i Scratch, så det hele blir ganske omfangsrikt. Et eksempel på en kloss som teller alle resultatene av 1 000 000 terningkast er vist i eksempel 5.

Eksempel 5:

Klossen under gjør 1 000 000 simuleringer av kast med en terning, og registrerer antall enere, toere, og så videre.

Det første vi gjør, er å opprette ei liste vi har kalt gunstige, en variabel vi har kalt mulige, og en variabel vi har kalt øyne.

Først i klossen sørger vi for at lista er synlig på scenen, og at den i utgangspunktet er tom, slik at vi alltid starter med ei tom liste hvis vi bruker klossen flere ganger etter hverandre. Deretter gjennomløper vi ei løkke som legger til 0 i lista seks ganger. Så setter vi variabelen mulige til 1 000 000, og går inn i ei løkke som gjennomløpes mulige, altså 1 000 000, ganger. For hvert gjennomløp i løkka genererer vi et tilfeldig tall mellom 1 og 6, og tildeler det til variabelen øyne. Deretter øker vi verdien til element nummer øyne i lista med 1. Dessverre har ikke Scratch noen kloss for å endre verdier i lister, slik som klossen "endre … med …", som kan brukes på vanlige variabler. For å øke verdien til element øyne, må vi derfor først lese ut den tidligere verdien, noe vi gjør med klossen "element øyne i gunstige". Så bruker vi en addisjons-kloss til å addere 1, før vi legger den nye verdien inn i lista, ved hjelp av klossen "erstatt element øyne i gunstige med …".

Kloss som registrer alle resultatene av 1 000 000 simulerte terningkast

Når vi klikker på klossen i eksempel 5, genereres ei liste som vises på scenen:

Liste over gunstige utfall for terningkast 1 til 6

Innholdet vil variere noe fra gang til gang, men det ser ut til å være rundt 167 000 gunstige i alle de seks tilfellene. Det er rimelig, fordi sannsynligheten for å få ener, toer, trer, firer, femmer eller sekser i et terningkast alle er 16, så forventet antall er 10000006166666.

Øvingsoppgave 4:

Ta utgangspunkt i klossen i eksempel 5, og modifiser den slik at den teller opp forekomstene av summer av antall øyne på to terninger.

Hint: Utvid lista til 12 elementer, og sett øyne lik summen av to "tilfeldig tall fra … til …"-klosser.

Hvis vi i tillegg til å telle hvor mange ganger vi får ener, toer, og så videre, også ønsker å anslå de tilhørende sannsynlighetene, kan vi bygge på klossen slik det er vist i eksempel 6. Her oppretter vi ei ny liste som skal inneholder sannsynlighetene, og beregner innholdet i hvert element ved å dividere det tilsvarende elementet i gunstige med mulige.

Eksempel 6:

Klossen under kan hektes på klossen fra eksempel 5. Før vi bygger klossen, oppretter vi ei liste vi har kalt sannsynligheter. Først i klossen gjør vi sannsynligheter synlig på scenen, og tømmer den for innhold. Så setter vi variabelen øyne til 1. øyne skal fungere som indeks når vi henter ut verdiene fra lista gunstige. Vi går så inn i ei løkke som gjennomløpes like mange ganger som det er elementer i gunstige, noe vi finner ved hjelp av klossen "lengen av gunstige". Vi kunne brukt tallet 6 i stedet for denne klossen, siden vi vet at lista inneholder 6 elementer, men den valgte løsningen er mer fleksibel. Hvis antall elementer i gunstige endrer seg, vil antall gjennomløp i løkka justeres automatisk. For hvert gjennomløp bruker vi øyne som indeks til å hente ut en verdi fra gunstige. Denne verdien dividerer vi så på mulige, og legger resultatet til i sannsynligheter. Deretter øker vi verdien til øyne med 1, slik at vi ved neste gjennomløp av løkka henter ut neste verdi fra gunstige.

Kloss som beregner sannsynligheter basert på forkomster

Øvingsoppgave 5:

Utvid klossen fra øvingsoppgave 4 slik at den også lager ei liste med sannsynligheter for de forskjellige summene.

Hint: Ta utgangspunkt i klossen i eksempel 6, og vurder om du må gjøre noen endringer.