Adloun

Simuler n'importe quelle loi discrète finie

Exercice · niveau 2 · mathématiques appliquées (ECG 1re année), chapitre 10 — Probabilités — variables aléatoires réelles · Simulation

Énoncé

Écrire une fonction qui simule une variable dont la loi est donnée par deux listes valeurs et probas, en tirant un réel uniforme et en cumulant les probabilités. La tester sur prenant , et avec probabilité chacune.

Corrigé

import numpy.random as rd

def simuler(valeurs, probas):
    u = rd.random()          # reel uniforme dans [0, 1[
    cumul = 0
    for i in range(len(valeurs)):
        cumul = cumul + probas[i]
        if u < cumul:
            return valeurs[i]
    return valeurs[-1]       # filet de securite, voir plus bas

X = [simuler([-2, 0, 3], [1/3, 1/3, 1/3]) for _ in range(100000)]
print(sum(X) / len(X))       # ~0.33

Pourquoi c'est correct. Les probabilités cumulées découpent en intervalles consécutifs, le -ième ayant pour longueur . La boucle renvoie valeurs[i] exactement lorsque tombe dans le -ième intervalle, ce qui arrive avec la probabilité puisque est uniforme. La fonction simule donc bien la loi voulue.

Le filet de sécurité. En arithmétique flottante, peut valoir . Si dépasse ce cumul final, la boucle se termine sans rien renvoyer et la fonction rend None — une fois sur des millions, et à un moment imprévisible. Le dernier return supprime ce cas.

Le contrôle. La moyenne empirique doit approcher , ce qu'on observe.

Le point à retenir. Cette méthode ne suppose rien de la loi — ni uniformité, ni forme particulière — seulement qu'on sache énumérer ses valeurs et leurs probabilités. Un seul tirage uniforme suffit à simuler n'importe laquelle.

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.