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.27263118345398873
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) """
= list(range(min, max+1))
L 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
= collections.Counter(random.randint(0, 10) for _ in range(2000)) # on réalise 2000 tirage
d_random = collections.Counter(randint1(0, 10) for _ in range(2000)) # on réalise 2000 tirage
d_randint1 = collections.Counter(randint2(0, 10) for _ in range(2000)) # on réalise 2000 tirage
d_randint2 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 193 160 189 182 164 158 185 197 193 173 206
randint1 185 190 174 186 175 164 206 189 202 178 151
randint2 204 169 204 179 170 188 179 166 177 176 188
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:
- implémenter une méthode
tirage
qui execute la fonction - être itérable et dont les itérateurs sont des suites infinies
d’appel à
tirage
- implémente une propriété
moyenne
(en calculant la moyenne sur \(p\) tirages) - implémente une propriété
ecart_type
(en calculant l’écart type sur \(p\) tirages) - être additionnable: (implémente
__add__
) - être multipliable: (implémente
__mul__
) - implémenter une méthode
support
qui retourne l’ensemble des valeurs prise en executanttirage
\(p\) fois. - implémente une méthode
distribution
qui retourne la distribution de la fonctiontirage
estimé sur \(p\) tirage. - implémente une méthode
affiche
qui dessine avec matplotlib la distribution de la classe.
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:
- \(1\to \frac{1}{3}\)
- \(2\to \frac{1}{6}\)
- \(3\to \frac{1}{6}\)
- \(4\to \frac{1}{6}\)
- \(5\to \frac{1}{9}\)
- \(6\to \frac{1}{18}\)
Une loi normale via une application du Théorème centrale limite
On pose:
= tirage_aleatoire(lambda: randint(0, 10)) T
On définit la séquence suivante:
- \(T_0 = T\)
- \(T_{i+1} = T_i + T\)
Calculer les premier terme de cette suite et affichez sa distribution.
Vous devriez obtenir une loi normale!
Une distribution de Poisson
En posant:
= tirage_aleatoire(lambda:randint(0, 1)) T
On définit la séquence suivante:
- \(T_0 = T\)
- \(T_{i+1} = T_i * T\).
Calculer les premiers terme de cette suite de
tirage_aleatoire
et affichez sa distribution.
- Calculer \(P = \Sigma_{i=0}^{100} T_i\) et afficher sa distribution.
Vous devriez retrouver une loi de Poisson (voir votre cours de math ou l’article wikipedia ici
Compiled the: mar. 26 nov. 2024 11:44:01 CET