Simuler une loi discrète donnée par un tableau
Exercice d'entraînement · niveau 2 · mathématiques (ECT 2e année), chapitre 12 — Informatique et travaux pratiques · Simulation de lois
Énoncé
On veut simuler la variable de loi :
| 0 | 1 | 2 | 3 | |
|---|---|---|---|---|
| 0,2 | 0,4 | 0,3 | 0,1 |
En n'utilisant que rd.random, écrire une fonction qui rend une valeur de , puis le programme qui estime sur tirages. Donner la valeur exacte de .
Corrigé
Le principe. On empile les probabilités : les réels de donneront , ceux de donneront , ceux de donneront , ceux de donneront . Comme rd.random() rend un réel uniforme de , chaque valeur sort avec la probabilité voulue, qui est exactement la longueur de son intervalle.
Les seuils. Ce sont les probabilités cumulées, que np.cumsum calcule : .
Le programme.
import numpy as np
import numpy.random as rd
val = np.array([0, 1, 2, 3])
pro = np.array([0.2, 0.4, 0.3, 0.1])
cum = np.cumsum(pro)
def tirage():
u = rd.random()
k = 0
while u >= cum[k]:
k = k + 1
return val[k]
rd.seed(3)
ech = np.array([tirage() for i in range(100000)])
print(np.mean(ech))
# 1.30469
La valeur exacte.
Ce que la simulation prouve, et ce qu'elle ne prouve pas. Elle affiche contre : elle corrobore le calcul, elle ne le démontre pas. Et le troisième chiffre après la virgule n'est pas garanti — l'annoncer serait la faute que la compétence de regard critique vise justement.
Le point délicat. La boucle while s'arrête forcément, puisque le dernier seuil vaut et que rd.random() rend un réel strictement inférieur à . Si les probabilités ne sommaient pas à , l'indice k sortirait du tableau : c'est le contrôle à faire avant d'exécuter.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.