Le jour de la Fête de la science, des étudiants organisent un jeu : le joueur lance 3 dés cubiques (un rouge, un vert, un bleu) bien équilibrés dont les faces sont numérotées de $1$ à $6$. S’il arrive à construire un triangle (non aplati) dont les côtés ont pour mesure les valeurs des faces obtenues, il gagne, sinon il perd.
Un débat peut être amené sur la possibilité de construire un triangle dont les côtés ont des mesures données. On peut aussi discuter des cas limites (cas d'égalité).
La fonction suivante prend en paramètres trois nombres entiers correspondant aux valeurs des faces des trois dés et renvoie $1$ si la partie est gagnée et $0$ sinon.
def partie(d1, d2, d3) :
sommeDesTroisCotes = d1 + d2 + d3
grand = max(d1, d2, d3)
sommeDesDeuxAutresCotes = sommeDesTroisCotes - grand
if grand < sommeDesDeuxAutresCotes:
return 1
else :
return 0
# Tests
print(partie(2,3,4))
print(partie(1,2,3))
print(partie(1,1,4))
Compléter un programme
Le programme précédent étant fourni en remplaçant les lignes 2, 3, 4 et 5 par sommeDesTroisCotes = ...
, grand = ...
, sommeDesDeuxAutresCotes = ...
et if ...
, demander aux élèves de compléter les lignes 2, 3, 4 et 5.
À l'aide de boucles imbriquées, on calcule le nombre de toutes les issues possibles (total) lors du jeu et le nombre de celles qui permettent de gagner (favorable). Le quotient favorable/total donne alors la probabilité de gagner lors d'une partie.
favorable, total = 0, 0
for d1 in range(1,7) :
for d2 in range(1,7) :
for d3 in range(1,7) :
if partie(d1, d2, d3) == 1:
favorable = favorable + 1
total = total + 1
print(favorable, total)
print(favorable/total)
On en déduit la probabilité $p=\dfrac{111}{216}\approx 0,51$.
Écrire un programme
Écrire un programme qui permet de calculer le nombre exact de cas favorables et le nombre de cas possibles.
Compléter un programme
Le programme précédent étant fourni en remplaçant les lignes 5, 6 et 7. par if ...
, favorable = ...
et total = ...
, demander aux élèves de compléter les lignes 5, 6 et 7.
On calcule la fréquence des parties gagnées sur un échantillon de $n$ parties simulées.
La fonction echantillon
prend en paramètre l'entier $n$ (taille de l'échantillon) et renvoie la proportion de parties gagnées sur cet échantillon.
from random import randint
def echantillon(n) :
gagne = 0
for i in range(n) :
d1 = randint(1,6)
d2 = randint(1,6)
d3 = randint(1,6)
gagne = gagne + partie(d1, d2, d3) # On peut préférer pédagogiquement un if
return gagne / n
print(echantillon(10))
print(echantillon(100))
print(echantillon(1000))
print(echantillon(1000))
Compléter un programme
Le programme précédent étant fourni en remplaçant les lignes 5 à 8 par d1 = ...
, d2 = ...
, d3 = ...
et gagne = ...
, demander aux élèves de compléter les lignes 5 à 8 dans manière à simuler n
parties et à compter dans la variable gagne
le nombre de parties gagnées (en utilisant la fonction partie
).
Expliquer un programme
Expliquer la ligne 8.
Le programme suivant affiche des listes contenant les proportions (ou fréquences) de parties gagnées pour 10 échantillons de taille 10, puis 10 échantillons de taille 100 et enfin 10 échantillons de taille 1000.
print([echantillon(10) for i in range(10)])
print([echantillon(100) for i in range(10)])
print([echantillon(1000) for i in range(10)])
Observer
Que constate-t-on dans les listes précédentes ?
La fonction ci-dessous permet de réaliser $N=100$ simulations différentes d'échantillons de $n=1000$ parties.
On a représenté par des points les fréquences obtenues :
%matplotlib inline
from matplotlib import pyplot as plt
from math import sqrt
n, p = 1000, 111/216
N = 100
mini, maxi = p-1/sqrt(n), p+1/sqrt(n)
for repet in range(N) :
f = echantillon(n)
if mini < f < maxi :
plt.plot(repet, f, "go")
else :
plt.plot(repet, f, "ro")
plt.plot([0,repet],[p, p], "m--")
plt.plot([0,repet],[mini, mini], "k--")
plt.plot([0,repet],[maxi, maxi], "k--")
plt.show()