À l'occasion d'un jeu de loterie, un joueur mise une certaine somme d'argent et fait tourner une première fois une roue circulaire découpée en $8$ secteurs de même angle numérotés de $1$ à $8$. Les quatre premiers secteurs sont rouges. S'il tombe sur le secteur $1$, il récupère le double de sa mise, sinon il relance la roue et gagne sa mise augmentée de $6$ euros s'il tombe sur un secteur de couleur rouge. Dans les autres cas, sa mise est perdue. On note $X$ la variable aléatoire donnant le gain en euros associé à ce jeu.
Nous allons maintenant simuler une partie.
La fonction randint
de la bibliothèque random
permet de générer aléatoirement des nombres entiers compris entre deux bornes données.
from random import randint
La fonction jeu
simule une partie. Elle prend la valeur de la mise en paramètre et renvoie la valeur du gain (sans la mise de départ). Cette fonction est ensuite testée pour une mise égale à $10$ euros.
def jeu(mise):
lancer1 = randint(1,8)
if lancer1 == 1:
gain = mise
else:
lancer2 = randint(1,8)
if lancer2 <= 4:
gain = 6
else:
gain = -mise
return gain
print(jeu(10))
Expliquer un programme
Expliquer les lignes 2, 7 et 10.
Compléter un programme
Le programme précédent étant fourni en remplaçant les lignes 7, 8 et 10 par if ...
, gain= ...
et gain= ...
, demander aux élèves de compléter les lignes 7, 8 et 10.
Dans cette section, l'expérience est répétée $n$ fois de manière à pouvoir calculer le gain moyen sur ces $n$ parties.
La fonction gainMoyen
prend en paramètres la mise initiale et un nombre $n$ de parties. Elle renvoie le gain moyen (en euro) obtenu au cours de ces $n$ parties avec cette mise initiale.
def gainMoyen(mise, n):
gainTotal = 0
for i in range(n):
gainTotal = gainTotal + jeu(mise)
return gainTotal/n
print(gainMoyen(10, 100000))
Compléter un programme
Le programme précédent étant fourni en remplaçant les lignes 4 et 5 par gainTotal = ...
et return ...
, demander aux élèves de compléter les lignes 4 et 5. .
Dans cette section, nous allons étudier le comportement asymptotique du gain moyen en fonction du nombre de parties.
Importation de la librairie graphique.
%matplotlib inline
import matplotlib.pyplot as plt
La fonction cumul
crée la liste des gains moyens obtenus pour des échantillons de taille variant entre $1$ et $n$.
On représente ensuite la valeur du gain moyen en fonction de la taille de l'échantillon afin de visualiser la convergence du gain moyen vers l'espérance du gain (loi des grands nombres).
def cumul(n):
F = []
gainTotal = 0
for i in range(n):
gainTotal = gainTotal + jeu(mise)
F.append(gainTotal/(i+1))
return F
Expliquer un programme
Expliquer la ligne 6.
Compléter un programme
Le programme précédent étant fourni en remplaçant la ligne 6 par F.append(...)
, demander aux élèves de compléter la ligne 6.
Le programme suivant représente le gain moyen en fonction du nombre de parties.
mise = 10
n = 5000
F = cumul(n)
plt.title("Gain moyen en fonction du nombre de parties.",color="#1e7fcb",fontsize=14)
plt.xlabel('n')
plt.ylabel('gain moyen')
plt.plot(F)
plt.show()
Mathématiques débranchées
À l'aide d'un arbre de probabilités, donner la loi de probabilités de $X$.
La fonction esperance
renvoie l'espérance d'une variable aléatoire dont la loi est donnée sous la forme de deux listes. Elle prend deux listes en paramètres : la liste des valeurs possibles pour $X$ et celle des probabilités associées.
def esperance(X,P):
E = 0
for i in range(len(X)):
E = E + X[i]*P[i]
return E
mise=10
X=[mise, 6, -mise]
P=[1/8, 7/16, 7/16]
print("L'espérance est égale à",esperance(X,P))
Compléter un programme
Le programme précédent étant fourni en remplaçant les lignes 7 et 8 par X= ...
et P= ...
, demander aux élèves de compléter les lignes 7 et 8 à l'aide de la loi de probabilité de $X$.
Écrire un programme
Écrire la fonction esperance
. (On pourra rappeler que la fonction len
donne la longueur d'une liste).
La fonction ecartType
renvoie l'écart-type d'une variable aléatoire dont la loi est donnée sous la forme de deux listes.
Elle prend deux listes en paramètres :
import math
def ecartType(X,P):
E = esperance(X,P)
V = 0
for i in range(len(X)):
V = V + P[i]*(X[i]-E)**2
return math.sqrt(V)
mise = 10
X = [mise, 6, -mise]
P = [1/8, 7/16, 7/16]
print("L'écart-type est égal à ", ecartType(X,P))
Compléter un programme
X= ...
et P= ...
, demander aux élèves de compléter les lignes 10 et 11 à l'aide de la loi de probabilité de $X$.V = ...
, demander aux élèves de compléter la ligne 7.Écrire un programme
Écrire la fonction ecartType
. (On pourra rappeler que la fonction math.sqrt
donne la racine).
Le programme ci-dessous permet, à l'issue de la simulation de $N$ échantillons même taille $n$, de calculer la proportion de ces échantillons pour lesquels l’écart entre le gain moyen et l'espérance du gain est inférieur ou égal à $\dfrac{2\sigma}{\sqrt n}$. Il permet aussi de visualiser la répartition des gains moyens obtenus pour chacun de ces $N$ échantillons. L'animation permet de faire apparaître successivement chacun des gains moyens.
%matplotlib inline
fig, ax1 = plt.subplots(1,figsize=(15, 6))
# Création de la liste des gainsmoyens pour N échantillons de taille n
def echantillonGains(mise, N, n):
echantillon = []
for i in range(N):
echantillon.append(gainMoyen(mise, n))
return echantillon
# Borne de l'intervalle
def bornes(E, sigma, n):
return E-2*sigma/math.sqrt(n),E+2*sigma/math.sqrt(n)
#Calcul de la proportion des cas où l’écart entre le gain moyen et l'espérance est inférieur ou égal à 2𝜎/√𝑛
def propPoint(echantillon, i, s):
filtre = [x for x in echantillon if x <= s and x >= i]
return len(filtre)/len(echantillon)
#Constantes
mise = 8.4
N = 200
n = 100
X = [mise, 6, -mise]
P = [1/8, 7/16, 7/16]
#Espérance et écart-type
E = esperance(X, P)
sigma = ecartType(X, P)
#Bornes de l'intervalle
i, s = bornes(E, sigma, n)
#Echantillon
echantillon = echantillonGains(mise, N, n)
print("La proportion des cas où l’écart entre le gain moyen et l'espérance du gain est inférieur ou égal à 2𝜎/√𝑛 est de",propPoint(echantillon,i,s))
#Graphique
ax1.plot(echantillon,'bo')
ax1.plot([0,N],[i,i],'r--',label='$\mu-2\sigma/\sqrt {n}$;$\mu+2\sigma/\sqrt {n}$')
ax1.plot([0,N],[E,E],'g--',label='$\mu$')
ax1.plot([0,N],[s,s],'r--')
ax1.legend(bbox_to_anchor=(1.01, 1), loc=2, borderaxespad=0.)
plt.show()
%matplotlib inline
import matplotlib.animation
from IPython.display import HTML
#Constantes
mise = 8.4
N = 100
n = 100
X = [mise, 6, -mise]
P = [1/8, 7/16, 7/16]
#Espérance et écart-type
E = esperance(X, P)
sigma = ecartType(X, P)
#Bornes de l'intervalle
i, s = bornes(E, sigma, n)
#Echantillon
echantillon = echantillonGains(mise, N, n)
#paramètres figure
fig, ax1 = plt.subplots(1, 1,figsize=(20, 6))
ax1.plot([0,N],[i,i],'r--',label='$\mu-2\sigma/\sqrt {n}$;$\mu+2\sigma/\sqrt {n}$')
ax1.plot([0,N],[E,E],'g--',label='$\mu$')
ax1.plot([0,N],[s,s],'r--')
points, = ax1.plot([],[],'bo')
ax1.legend(bbox_to_anchor=(1.01, 1), loc=2, borderaxespad=0.)
def init():
points.set_data([], [])
return (points,)
def animate(i):
global echantillon
points.set_data([range(i+1),echantillon[:i+1]])
return (points,)
plt.close ()
ani = matplotlib.animation.FuncAnimation(fig, animate, frames=N,init_func=init,blit=True)
# l'un ou l'autre
HTML(ani.to_jshtml())
#HTML(ani.to_html5_video())