Diskussion:Python: Skillnad mellan sidversioner
Hakan (diskussion | bidrag) |
Hakan (diskussion | bidrag) (→Yatzy) |
||
Rad 51: | Rad 51: | ||
Så jag undrar om det är någon som har lyckats skriva ett program som faktiskt ger rätt svar på sannolikheten att få Yatzy genom simulering? Eller om någon har ett förslag på hur man skall ta sig an det annat än att börja simulera utfallsträd? Och då helst på ett sätt som faktiskt är praktiskt genomförbart för en gymnasial nivå. | Så jag undrar om det är någon som har lyckats skriva ett program som faktiskt ger rätt svar på sannolikheten att få Yatzy genom simulering? Eller om någon har ett förslag på hur man skall ta sig an det annat än att börja simulera utfallsträd? Och då helst på ett sätt som faktiskt är praktiskt genomförbart för en gymnasial nivå. | ||
=== Malmös kod === | |||
<pre> | |||
import random | |||
def flest(T): | |||
antal = [0,0,0,0,0,0] | |||
for item in T: | |||
if item == 1: | |||
antal[0] = antal[0] + 1 | |||
elif item == 2: | |||
antal[1] = antal[1] + 1 | |||
elif item == 3: | |||
antal[2] = antal[2] + 1 | |||
elif item == 4: | |||
antal[3] = antal[3] + 1 | |||
elif item == 5: | |||
antal[4] = antal[4] + 1 | |||
else: | |||
antal[5] = antal[5] + 1 | |||
m = max(antal) | |||
index = antal.index(m) | |||
return index + 1 | |||
yatzy = 0 | |||
antalForsok = 100000 | |||
for i in range(antalForsok): | |||
t = [random.randint(1,6),random.randint(1,6),random.randint(1,6),random.randint(1,6),random.randint(1,6)] | |||
for j in range(0,2): | |||
f = flest(t) | |||
for i in range(5): | |||
if t[i] != f: | |||
t[i] = random.randint(1,6) | |||
if (t[0] == t[1] and t[1] == t[2] and t[2] == t[3] and t[3] == t[4]): | |||
yatzy = yatzy + 1 | |||
print('Sannolikheten för Yatzy! är '+ str(round(yatzy/antalForsok*100,2))+' %.') | |||
</pre> |
Versionen från 1 april 2018 kl. 18.56
Här lägger vi in länkar till kod som kan utvecklas till lektionssidor.
Länkar till fri kod som kan omvandlas till sidor
https://www.w3resource.com/python-exercises/python-basic-exercise-58.php summan av de första n heltalen
https://www.w3resource.com/python-exercises/python-basic-exercise-32.php least common multiple
https://www.w3resource.com/python-exercises/python-basic-exercise-31.php greatest common divisor
Skolverkets exempel
https://www.skolverket.se/polopoly_fs/1.268355!/Uppgifter_workshop_programmering_gymnasiet.pdf
Från
Linjära ekvationssystem med kod från Malmö stads kurs där det finns mer. Och CC. https://larportalen.skolverket.se/LarportalenAPI/api-v2/document/path/larportalen/material/inriktningar/1-matematik/Gymnasieskola/448_matematikundervisningmeddigitalaverktygII_GY/del_02/Material/Flik/Del_02_MomentA/Artiklar/MA2_Gy_02A_02_aktiviteter.docx
Malmös kurs
Matematisk programmering i Python
mattesnille
https://mattesnille.wordpress.com/2018/03/15/programmering/
Yatzy
https://repl.it/@larsakenorden/yatzy
På matematikbiennalen nyligen så gav Johan Falk en presentation om digitala verktyg och programmering. Han gav då följande exempel på uppgift som kan lösas genom programmering:
Vad är sannolikheten att slå Yatzy? (Det vill säga att få fem lika tärningar efter tre slag, där du själv väljer vilka tärningar du behåller respektive slår om mellan varje slag.)
Bra exempel, tänkte jag. Så igår i ett ögonblick av experimentlusta satte jag mig ner och kodade ihop ett program som gör precis detta (efter ungefär den algoritm som Johan presenterade). Kastar fem tärningar, sparar dem som jag har flest av och kastar igen. Räknade ut hur många gånger jag fick Yatzy och finner att jag får en tillräckligt liten varians för att det skall kännas statistiskt övertygande.
Bra så, tänker jag. Och bara för min egen tillfredsställelse dubbelkollade jag mot det analytiska svaret.
Stort misstag. Inte samma svar.
Jag får inte samma svar vid simulering som vid analys. Något är fel. Ryggmärgsreaktionen är att skylla på slumpfunktionen, men det är ju bara naivt.
Efter ett tag går det upp för mig. Det finns fler sätt att faktiskt få Yatzy. Om du efter ett kast har 4 stycken ettor och en sexa så är det normala att spara ettorna och hoppas på att få en etta på den sista tärningen. Men du kunde lika gärna ha sparat sexan och hoppas på att få fyra sexor i nästa kast. Bägge ger Yatzy, men i simuleringen räknar vi bara med det första fallet.
Gott så, bara att modifiera programmet lite grann då. Och där körde jag fast.
Så jag undrar om det är någon som har lyckats skriva ett program som faktiskt ger rätt svar på sannolikheten att få Yatzy genom simulering? Eller om någon har ett förslag på hur man skall ta sig an det annat än att börja simulera utfallsträd? Och då helst på ett sätt som faktiskt är praktiskt genomförbart för en gymnasial nivå.
Malmös kod
import random def flest(T): antal = [0,0,0,0,0,0] for item in T: if item == 1: antal[0] = antal[0] + 1 elif item == 2: antal[1] = antal[1] + 1 elif item == 3: antal[2] = antal[2] + 1 elif item == 4: antal[3] = antal[3] + 1 elif item == 5: antal[4] = antal[4] + 1 else: antal[5] = antal[5] + 1 m = max(antal) index = antal.index(m) return index + 1 yatzy = 0 antalForsok = 100000 for i in range(antalForsok): t = [random.randint(1,6),random.randint(1,6),random.randint(1,6),random.randint(1,6),random.randint(1,6)] for j in range(0,2): f = flest(t) for i in range(5): if t[i] != f: t[i] = random.randint(1,6) if (t[0] == t[1] and t[1] == t[2] and t[2] == t[3] and t[3] == t[4]): yatzy = yatzy + 1 print('Sannolikheten för Yatzy! är '+ str(round(yatzy/antalForsok*100,2))+' %.')