Activité 9 - Loterie

Présentation de l'activité

  • Références au programme :
    • Spécialité mathématiques de première générale : Algorithme renvoyant l’espérance, la variance ou l‘écart type d’une variable aléatoire.
    • Spécialité mathématiques de première générale : Simuler une variable aléatoire avec Python.
    • Spécialité mathématiques de première générale : Lire, comprendre et écrire une fonction Python renvoyant la moyenne d’un échantillon de taille 𝑛 d’une variable aléatoire.
    • Spécialité mathématiques de première générale : Étudier sur des exemples la distance entre la moyenne d’un échantillon simulé de taille $n$ d’une variable aléatoire et l’espérance de cette variable aléatoire.
    • Spécialité mathématiques de première générale : Simuler, avec Python ou un tableur, $N$ échantillons de taille $n$ d’une variable aléatoire, d’espérance $\mu$ et d’écart type $\sigma$. Si $m$ désigne la moyenne d’un échantillon, calculer la proportion des cas où l’écart entre $m$ et $\mu$ est inférieur ou égal à 2$\frac{\sigma}{\sqrt{n}}$.
  • Description : activité abordant les notions de simulation et d'espérance de gain dans le contexte d'un jeu de loterie.

Situation

À 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.

Simulation du 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.

In [1]:
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.

In [2]:
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))
6
Suggestions pédagogiques
  • 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.

Simulation de $n$ expériences

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.

In [3]:
def gainMoyen(mise, n):
    gainTotal = 0
    for i in range(n):
        gainTotal = gainTotal + jeu(mise)
    return gainTotal/n
print(gainMoyen(10, 100000))
-0.56488
Suggestions pédagogiques
  • Expliquer un programme
    • Expliquer la ligne 2.
    • Que fait la ligne 4 ?
  • 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. .

Convergence du gain moyen

Dans cette section, nous allons étudier le comportement asymptotique du gain moyen en fonction du nombre de parties.

Importation de la librairie graphique.

In [4]:
%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).

In [5]:
def cumul(n):
    F = []
    gainTotal = 0
    for i in range(n): 
        gainTotal = gainTotal + jeu(mise)
        F.append(gainTotal/(i+1))
    return F
Suggestions pédagogiques
  • 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.

Estimation de la mise rendant le jeu équitable

Le programme suivant représente le gain moyen en fonction du nombre de parties.

In [6]:
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()
Suggestions pédagogiques
  • Tester le programme précédent avec différentes valeurs de mise. Quelle doit être la valeur approximative de la mise pour que le jeu soit équitable ?
Réponse On trouve environ une mise égale à 8,4 euros.

Étude de la loi de probabilités de la variable aléatoire $X$

Suggestions pédagogiques
  • Mathématiques débranchées

    À l'aide d'un arbre de probabilités, donner la loi de probabilités de $X$.

Réponse P(X=mise)=1/8, P(X=6)=7/16, P(X=-mise)=7/16

Programme de calcul de l'espérance 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.

In [7]:
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)) 
L'espérance est égale à -0.5
Suggestions pédagogiques
  • 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).

Calcul de l'espérance de $X$

Suggestions pédagogiques
  • Mathématiques débranchées :
    • Calculer la valeur de l'espérance de $X$ en fonction de la mise.
    • Déterminer la valeur de la mise rendant le jeu équitable.
Réponse $\mu=E(X)=\dfrac{42-5\times mise}{16}$ et $\mu=E(X)=0 \Leftrightarrow mise=\dfrac{42}{5}=8,4$

Programme de calcul de l'écart-type de $X$

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 :

  • la liste des valeurs possibles pour $X$;
  • la liste des probabilités associées aux valeurs possibles.
In [8]:
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)) 
L'écart-type est égal à  8.470537173048708
Suggestions pédagogiques
  • Compléter un programme

    • Le programme précédent étant fourni en remplaçant les lignes 10 et 11 par X= ... et P= ..., demander aux élèves de compléter les lignes 10 et 11 à l'aide de la loi de probabilité de $X$.
    • Le programme précédent étant fourni en remplaçant la ligne 7 par 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).

Animations susceptibles d'être présentées aux élèves : simulation de 𝑁 échantillons de taille 𝑛

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.

In [9]:
%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()
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 0.955
In [10]:
%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())
Out[10]:


Once Loop Reflect