Trekronor

Tidningen Hufvudstadsbladet här i Helsingfors har en liten problemhörna med namnet Tankenöten. Bloggaren brukar besvara nötterna nu och då. Den senaste nöten var relativt enkel att besvara, men den gav en liten möjlighet att skriva en programsnutt. Frågan var kort och gott:

Anta att du singlar tre slantar på en gång. Hur många av de möjliga utfallen är sådana att man får (exakt) två klave.

Eftersom bloggaren noterat att läsare i Sverige ibland figurerar i bloggen, döptes problemet till ”Tre kronor” (jag vet, fysikerhumor!).

Vi beräknar alltså sannolikheten för exakt två kronor i en slantsingling med tre slantar. Problemet i sig är inte svårt. Utfallsrummet (R – krona och L – klave) är:

RRR, RLR, RRL, RLL

LLL, LRL, LLR, LRR

Vi har alltså 8 möjliga utfall och exakt två kronor i tre av dem (kunde förklara namnet på inlägget??)

Sannolikheten för exakt 2 kronor bland de tre slantarna borde alltså vara 3/8 eller ca 0,375.

Passade på at simulera detta med ett litet program. Måste också skryta en aning. För första gången under min över 30-åriga lärarkarriär, lyckades programmeringen utan ett enda felmeddelande på vägen. Rent otroligt!

Programmet hittas i Box-verktyget. Får fritt laddas ner och modifieras av den som vill!

Här är en programlistning med enkla förklaringar:

Define trekronor()=                                          Programmet namnges
Prgm

{0,0,0,0}→kronor                                              En räknelista skapas för utfallen 0, 1, 2 eller 3 kr

Request ”Antal kast”,n                                     Antalet singlingar definieras

For i,1,n :{0,0,0}→kast                                  Loop för kasten

For j,1,3                                                       De tre slantarna singlas i en loop

If rand()>0.5 Then :                                 Ett slumptal i int. 0-1 ges. Större än 0,5: Kr

kast[j]:=1                                                Eventuell krona noteras

EndIf                                                          Slut på kontrollen

sum(kast)→s                                              Antalet kronor noteras

EndFor                                                           Slut på slantsinglingsloopen

kronor[s+1]+1→kronor[s+1]                   Räknelistan uppdateras

EndFor                                                             Slut på simuleringen

EndPrgm

 

När programmet körts, visas resultatet genom kommandot kronor.  Kommandot kan givetvis skrivas in i programmet. Också de relativa antalet ”exakt 2 kronor” kan skrivas in! Prova!

 

Annonser

Ett hasardspel med tärning + en simulation av spelet

Bilderna förklarar själva problemet. Filen finns i BOX-verktyget, programarkivet. Namn: Väntevärde.tns.

Sedan simulerar vi spelet med ett  program

Vi tar oss en titt på programmet:

Define väntevärde()=
Prgm

Local vv,n,i,re                            Variablerna definiers som variabla

0→vv                                            Variabeln vv visar det förväntade värdet på vinst/förlust

Request ”Antal kast”,n            Antal kast fastställs

For i,1,n                                       En loop initieras

re:=int(6*rand())+1                  Tärningen ”kastas”. Resultat = re

vv-1.5→vv                                    Spelinsatsen betalas

If mod(re,2)=1 Then                Udda/jämnt kollas. Här udda. Obs hur mod-kommandot används!

vv-2→vv                                       Spelförlust på 2 euro

EndIf                                            Slut på kollen udda

If mod(re,2)=0 Then               Udda/jämnt kollas. Här jämnt.

vv+re→vv : EndIf                      Spelvinst utbetalas.

EndFor                                        Slut på kolen jämnt

Disp vv                                        Resultatet vv visas

EndPrgm                                    Programslut

Kulorna

Denna övning baserar sig på en elevfråga.

Anta att vi har två kulor, vardera med massan 1,00kg och radien 5,00 cm. Kulorna placeras i vila i en tom rymd, utan störande gravitationskrafter. Deras medelpunkter ligger exakt en meter från varandra. Sedan släpps de. Hur länge räcker det innan de pga. den inbördes verkande gravitationskraften slår emot varandra och vilken är deras hastighet då?

Uppgiftens lösning är inte enkel att beräkna analytiskt. Vi gör ett försök att uppskatta lösningen med ett program.

Programfilen finns i BOX-lådan till höger!

Några förklaringar:

Define kulor()=                                 Programmet namnges
Prgm

Local dt,gr,a,b,c,m,dt                     Lokala variabler definieras

6.67E−11→gr                                    gravitationskonsten definieras

0→t                                                      tidräknaren nollas

60→dt                                                  deltavärdet för tiden (60 s) definieras

1→r                                                       startavståndet

1→m                                                     massorna

0→v                                                      vilostart

0→a                                                      accelerationen nollas

Lbl b                                                      Flagga b

60+t→t                                                 tiden uppdateras med en minut

((gr*m)/(r^(2)))→a                         accelerationen beräknas

v+a*dt→v                                            hastigheten uppdateras

r-2*v*dt→r                                          sträckan uppdateras

If mod(t,3600)=0 Then                   kontroll om timmar uppnås, kontrollslinga

Disp ((t)/(3600))                              timmarna skrivs ut

EndIf                                                     slut på kontrollslingan

If r<0.1 Then                                      kontroll om kontakt mellan kulorna uppnåtts

Goto c                                                   dirigering till flagga c

EndIf                                                    slut på kontrollslingan

Goto b                                                  retur till flagga b

Lbl c                                                     Flagga c

Disp approx(((t)/(3600)))            utskrift av resultatet tid

Disp v                                                  utskrift av sluthastigheten

EndPrgm

Programmet körs med kommandot kulor(), i räknarrutan.

Resultat: Det räcker drygt 26 timmar innan kulorna slår ihop. Deras hastighet är då ca 0,025 mm/s.

De stora talens lag

Nu ska vi undersöka ett fenomen inom sannolikhetsläran. Vid ett stort antal slumpförsök, kommer det totala resultatet att konvergera mot ett väntevärde. Om man t.ex. singlar slant tillräckligt många gånger, kommer antalet kronor att närma sig 50 % av totala antalet resultat.

Filen som här presenteras finns i BOX-rutan i arkivet Sanolikheter.

Vi simulerar detta med ett litet program. Först en förklaring på Anteckningar-skärmen. Sedan startar vi en räknarskärm. På den aktiveras ett program.

Program och funktioner matas in på en skärm med detta utseende. Med hjälp av MENU-tangenten hittar man de kommandon och kontrollstrukturer som behövs.

Programmeringsspråket är ”Texas basic”, ett enkelt programmeringsspråk utan finesser. Jag tar mig friheten att kommentera strukturen.

Define storatal()=          programmet namnges
Prgm                                  programstart

Local n,l,r                        variablerna n,l och r definieras som lokala (blir inte kvar efter körningen)

1→n

0→l

0→r                                  variablerna tilldelas startvärden (n-varvräknare, l – antal klave, r – antal krona)

{n}→ant

{0}→forh                       två listor påbörjas, ena för singlingsvarvet, andra för förhållandet mellan kronor och antalet kast

For x,1,100                    en loop på 100 kast påbörjas

augment(ant,{x})→ant        listan med antalen kast utökas kast för kast i loopen

If rand()>0.5 Then      en slumptalsgenerator används. Resultaten varierar mellan 0 och 1. Större än 0,5 – krona. 

1+r→r                            Kontroll:  om krona -antalet r ökar ett steg

Else                                  om klave

1+l→l                             antalet klave ökar ett steg

EndIf                             slut på kontrollen

augment(forh,{approx(((r)/(r+l)))})→forh          forhållandelistan uppdateras

EndFor                          slut på räkneloopen

Disp approx(((r)/(r+l)))    visa förhållandet mellan kronor och totala antalet

EndPrgm                      programslut

Tredje skärmen är en visar statistiken. Relativa antalet kronor från 0 till 100 kast visas.

Skärmen är delad. Nedanför grafen finns en liten räknarsärm. Mata in kommandot storatal() och tryck på ENTER.

Varje tryck på ENTER ger sedan en ny körning med graf.