Sovellus: Noppien heitto

91 days ago by Lauri_Ruotsalainen

Lauri Ruotsalainen, 2011
Sage-ohjelmisto matematiikan opetuksessa
 

Noppien heitto

Simulaatiossa heitetään k kertaa s-sivuista noppaa ja lasketaan noppien näyttämien silmälukujen summa. Toistetaan koetta n kertaa ja lasketaan saatujen havaintojen suhteelliset frekvenssit. Esitetään jakauma graafisesti sekä lasketaan satunnaismuuttujan odotusarvo, varianssi ja keskihajonta. Kuvaajassa näkyy erityisen hyvin keskeisen raja-arvolauseen vaikutus, kun heittojen lukumäärää kasvatetaan: jakauma lähestyy normaalijakaumaa.

Kuva:

# Noppien heitto # Lauri Ruotsalainen, 2011 import random from sage.plot.bar_chart import BarChart @interact def noppien_heitto(k = slider(1, 10, 1, default=3, label="Noppien lukumäärä:"), s = slider(2, 20, 1, default = 6, label="Nopan suurin silmäluku:"), n = input_box(default=10000, label="Heittojen lukumäärä:"), normaalijakauma = ("Näytä normaalijakauman tiheysfunktio:", false)): # Arvotaan noppien summa ja lisätään se avain-arvo -pareista koostuvaan hakemistoon "havainnot". Hakemiston avaimia ovat summat ja avaimia vastaavat arvot ovat summaa vastaavien havaintojen lukumäärät. havainnot = {} for i in range(n): summa = 0 for j in range(k): summa += random.randint(1, s) if summa not in havainnot: havainnot[summa] = 0 havainnot[summa] += 1 # Luodaan indeksilista mahdollisista summien arvoista ja lasketaan havaintojen suhteelliset osuudet. indeksit = range(k, s*k+1) suhteelliset_osuudet = [havainnot.get(i,0)/n for i in indeksit] # Pylväsdiagrammia varten poikkeutetaan indeksien arvoja -0.25, jolloin pylvään keskikohta osuu indeksin kohdalle, kun pylvään leveys on 0.5. poikkeutetut_indeksit = [c - 0.25 for c in indeksit] # Piirretään pylväskuvio. G = Graphics() G.add_primitive(BarChart(poikkeutetut_indeksit, suhteelliset_osuudet, {"width":0.5, "rgbcolor":(0,0,1), "legend_label":0})) # Määritellään normaalijakauman tiheysfunktio ja lasketaan satunnaismuuttujan odotusarvo ja varianssi normaalijakauman_tiheysfunktio(E,V,x) = 1/sqrt(2*pi*V)*e^(-(x-E)^2/(2*V)) odotusarvo = sum([1, 2, .. , s])/s*k i = var("i") varianssi = (sum(i^2, i, 1, s)/s - (sum([1, 2, .. , s])/s)^2)*k # Piirretään normaalijakauma, jos se on kytketty päälle sovelluksessa if (normaalijakauma): G += plot(normaalijakauman_tiheysfunktio(odotusarvo, varianssi, x), xmin=k, xmax=k*s) # Esitetään kuva ja satunnaismuuttujan tunnusluvut G.show(xmin=k, xmax=s*k, ymin=0) html("$\\text{Odotusarvo = %s}$" %(N(odotusarvo, digits=6))) html("$\\text{Varianssi = %s}$" %(N(varianssi, digits=6))) html("$\\text{Keskihajonta = %s}$" %(N(sqrt(varianssi), digits=6))) 
       

Click to the left again to hide and once more to show the dynamic interactive window