L3 MIASHS, Algorithme et Programmation 3, année 2024

Tirage aléatoire

Rappel sur le module random

On peut réaliser un tirage aléatoire à l’aide de ce module, de plusieurs façon.

import random
print(random.random()) # retourne un nombre entre 0 et 1.
0.9318087256458871

Pour tirer un nombre entier on peut soit tirer un nombre entre 0 et 1 et faire une translation et arrondir ou utiliser la fonction randint qui fait la même chose:

def randint1(min, max):
    """ retourne un nombre choisi uniformement entre min et max (inclu) """
    if max <= min:
        raise ValueError("max devrait être plus grand que min")
    return int((max+1-min)*random.random())

On peut également utiliser la fonction choice qui tire un élément au hasard dans une Sequence (typiquement une liste)

def randint2(min, max):
    """ retourne un nombre choisi uniformement entre min et max (inclu) """
    L = list(range(min, max+1))
    return random.choice(L)

On peut vérifier que c’est une distribution à peut prêt uniforme. Voici la distribution pour 2000 tirages de chacune de ces fonctions.

import collections
d_random = collections.Counter(random.randint(0, 10) for _ in range(2000)) # on réalise 2000 tirage
d_randint1 = collections.Counter(randint1(0, 10) for _ in range(2000)) # on réalise 2000 tirage
d_randint2 = collections.Counter(randint2(0, 10) for _ in range(2000)) # on réalise 2000 tirage
print("entier        ", "\t".join(str(i) for i in range(0, 11)))
print("random.randint", "\t".join(str(d_random[i]) for i in range(0, 11)))
print("randint1      ", "\t".join(str(d_randint1[i]) for i in range(0, 11)))
print("randint2      ", "\t".join(str(d_randint2[i]) for i in range(0, 11)))
entier         0    1   2   3   4   5   6   7   8   9   10
random.randint 169  169 160 188 193 203 180 184 178 188 188
randint1       183  190 171 199 158 160 187 205 198 171 178
randint2       184  175 196 178 170 199 178 174 188 182 176

Une classe pour les tirages aléatoire

On va réaliser une classe dont l’objectif est de modéliser les tirages aléatoires dans les entiers et de donner des informations à leur sujet. On ne modélise ici que les tirages indépendants.

Créer une classe tirage_aleatoire qui prend en argument une fonction un argument optionnel \(p\) dont la valeur par défaut est \(10^6\). Cette classe doit:

Corrections du TP jusqu’à __mul__

Des tirages biaisés

Instancier tirage_aleatoire pour faire un dé pipé (valeur de 1 à 6) avec les probabilités suivante:

Une loi normale via une application du Théorème centrale limite

On pose:

T = tirage_aleatoire(lambda: randint(0, 10))

On définit la séquence suivante:

Calculer les premier terme de cette suite et affichez sa distribution.

Vous devriez obtenir une loi normale!

Une distribution de Poisson

En posant:

T = tirage_aleatoire(lambda:randint(0, 1))

On définit la séquence suivante:

Calculer les premiers terme de cette suite de tirage_aleatoire et affichez sa distribution.

Vous devriez retrouver une loi de Poisson (voir votre cours de math ou l’article wikipedia ici

Corrections


Compiled the: ven. 05 sept. 2025 16:27:14 CEST