Twee dobbelstenen
Tot nu toe gooide je met één steen, en kwam elk getal even vaak. Met twee stenen tel je de som, en die komt niet bij elk getal even vaak uit. Dat zie je het best in een staafdiagram.
Voorspel
telling = {}
for som in range(2, 13):
telling[som] = 0
print(telling)
Wat print dit?
Antwoord
{2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0}
range(2, 13) stopt vóór de 13, dus je krijgt elke som van 2 tot en met 12:
alles wat twee stenen samen kunnen gooien.
Zo werkt het
Met een loop zet je elke som op 0, in plaats van elf sleutels uit te typen.
Een staafdiagram tekent de bibliotheek matplotlib, en die hoef je hier niet te
leren. Onderaan de code van het onderzoek staan de drie regels die je nodig
hebt: import matplotlib.pyplot as plt, dan
plt.bar(list(telling), list(telling.values())) en plt.show(). plt.bar
tekent een staaf voor elke sleutel van telling, zo hoog als het getal dat
erbij hoort. De eerste keer laden duurt het tekenen een paar tellen.
Onderzoek
- Draai de code. Zijn de staven van één dobbelsteen even hoog?
- Zet
worpenop 6000. Wat gebeurt er met de verschillen? - Haal
6: 0uittellingweg en draai opnieuw. Wat gebeurt er?
Antwoorden
- Bijna: elke staaf is rond de 100, maar de een wat hoger dan de ander.
- De staven zijn nu bijna precies even hoog, rond de 1000.
- Python stopt met een foutmelding zodra er een 6 valt. Zie Er gaat iets mis.
Opdracht: twee dobbelstenen
Gooi 6000 keer met twee dobbelstenen, en tel hoe vaak elke som voorkomt, van 2 tot en met 12. Print per som hoe vaak hij voorkwam, en teken het als staafdiagram. Welke som komt het vaakst?
Begin klein, en breid de code stap voor stap uit:
- Draai de code: hij gooit één keer met twee stenen.
- Zet het gooien in een loop van 10 keer, en print alleen de som.
- Tel de sommen in een dictionary
telling, en print die na de loop. Zet de loop daarna op 6000, en haal de print van de som weg. - Print per som van 2 tot en met 12 een regel, en zet de drie regels matplotlib uit het onderzoek eronder.
Tip
Tel je zoals in het spamfilter, met if som in telling, dan werkt het, maar
staan de sommen in de volgorde waarin ze voor het eerst vielen. Zet je vóór de
loop elke som van 2 tot en met 12 op 0, dan staan ze op volgorde.
Antwoord
import random
worpen = 6000
telling = {}
for som in range(2, 13):
telling[som] = 0
for i in range(worpen):
eerste = random.randint(1, 6)
tweede = random.randint(1, 6)
som = eerste + tweede
telling[som] = telling[som] + 1
for som in telling:
print(som, telling[som])
import matplotlib.pyplot as plt
plt.bar(list(telling), list(telling.values()))
plt.show()
De staven lopen op tot de 7 en dan weer af, als een dak. De 7 wint, met ongeveer 1000 keer. 2 en 12 komen het minst voor, rond de 170 keer. Voor een 2 moeten allebei de stenen 1 zijn, maar voor een 7 zijn er zes manieren: 1 en 6, 2 en 5, 3 en 4, en ook andersom. Twee stenen kunnen op 36 manieren vallen, dus de kans op 7 is 6 op de 36: een zesde. Je simulatie komt daar dicht bij.
Er gaat iets mis
KeyError: 7
Oorzaak: je telt bij een som die nog geen sleutel is in telling. Begin
je met een lege telling, of met alleen de ogen van één steen (1 tot en met
6), dan staat 7 er niet in. Het getal in de foutmelding is de som die mist.
Oplossing: zet elke som die kan uitkomen eerst op 0.
# FOUT
telling = {}
som = 3 + 4
telling[som] = telling[som] + 1
# GOED
telling = {}
for som in range(2, 13):
telling[som] = 0
som = 3 + 4
telling[som] = telling[som] + 1
Door naar de weddenschap van de Méré.