Le hasard et les probabilités*, avec python
Hasard avec Python
En anglais random signifie aléatoire. C'est ainsi le nom de la bibliothèque de fonctions Python à charger en premier dans un programme Python: tout programme Python dans lequel on veut utiliser des calculs "au hasard" doit commencer par la ligne:from random import random
Ensuite, la fonction random donne un nombre au hasard, dans l'intervalle [0;1[, et la fonction randint(n,m) donne un nombre entier au hasard entre a et b (randint pour random integer, "entier aléatoire").
Tester (plusieurs fois) le programme suivant:
from random import random
a=random()
print(a)
b=randint(3,12)
print(b)
Réviser ses tables de multiplication
Exercice 1:
- Que fait le programme suivant ? Compléter les points de suspension par les messages de votre choix
from random import randint a=randint(0,10) b=randint(0,10) m=a*b print(a," x ",b," = ") r=int(input("?")) if (r==m): print(" ... ") else: print(" ... ")
- Modifier ce programme, avec une boucle, pour qu'il demande le résultat de cinq calculs.
((Re)voir par exemple l'exercice 2 sur les suites, ou plus généralement le cours sur les boucles for avec la fonction range)) - Ajouter enfin un compteur dans ce progamme, qui compte le nombre de bonnes réponses, et affiche finalement après toutes les questions et réponses données, le score obtenu.
(un compteur était utilisé par exemple pour le calcul d'un seuil avec les suites, dans le programme de l'exercice 3 sur les suites)
Lancer des dés
Exercice 2:
- La fonction randint tire un nombre entier aléatoirement
(randint est la contraction de rand, pour random ou aléatoire, et int, pour integer ou entier).
Que fait le programme suivant ? Qu'affiche-t'il ?from random import randint d=randint(1,6) print(d) if (d==6): print("Gagné") else: print("Dommage")
- Modifier le programme précédent avec une boucle en un programme qui lance 10 fois un dé et qui compte et affiche le nombre de 6 obtenus.
Calculer et afficher alors, le pourcentage de 6 obtenus.
Que devient ce pourcentage lorsqu'on augmente le nombre de lancers (10 lancers, puis 100, 1000, …)
Exercice 3:
- Le programme suivant simule le tirage d'un dé.
Modifier ce programme pour qu'il simule le tirage de deux dé successivement, affiche la somme des deux dés, et affiche "Gagné" si cette somme vaut 4.from random import randint d=randint(1,6) print(d) if (d==6): print("Gagné") else: print("Dommage")
- De même que dans l'exercice précédent, modifier alors ce programme pour qu'il répète 10 fois le tirage de deux dés et compte le nombre de fois que la somme de 4 a été obtenue.
- Afficher alors aussi le pourcentage de 4 obtenus.
Que devient ce pourcentage lorsqu'on augmente le nombre de lancers (10 lancers, puis 100, 1000, …)
Hasard à Monte Carlo
On désigne par méthode de Monte-Carlo des méthodes de calcul qui cherchent à approcher un résultat numérique par des procédés aléatoires.Ces méthodes sont particulièrement utilisées, par exemple, pour des calculs d'aires (intégrale d'une fonction), en physique des particules en simulant la présence ou non "au hasard" de particules, ou encore pour estimer un risque dans une décision financière par une approche statistique en affectant diverses lois de probabilités aux variables en jeu.
S'approcher de π, au hasard
Dans le premier exemple, illustré ci-dessous, on se place dans un carré de côté 4 (de −2 à 2, en abscisse et ordonnée), et on cherche à estimer l'aire du disque de rayon 1.Dans ce carré, on tire des points au hasard; chaque point tiré est soit dans le disque, soit à l'extérieur du disque.
Exercice 4:
Quelle est l'aire du carré ? du disque ?
Quelle est la probabilité pour qu'un point tiré au hasard tombe dans le disque ?
Connaissant cette probabilité P, ou une estimation de cette probabilité, comment trouver une estimation du nombre π ?
Quelle est l'aire du carré ? du disque ?
Quelle est la probabilité pour qu'un point tiré au hasard tombe dans le disque ?
Connaissant cette probabilité P, ou une estimation de cette probabilité, comment trouver une estimation du nombre π ?
Le programme suivant illustre ces calculs graphiquement en donnant à chaque fois le nombre de points dans le disque, le ratio du nombre de points sur le nombre total de points tirés, ainsi que le produit de ce ratio avec l'aire du carré.
Aire du carré
Nombre de points à l'intérieur du cercle:
Ratio:
Ratio x Aire rectangle:
On passe à la programmation en Python.
Exercice 5:
- La fonction
random()
de Python permet de tirer un nombre x aléatoire, et uniformément, entre 0 et 1.
On souhaite quant à nous tirer des nombres entre −2 et 2. La variable x2 suivante est alors une variable aléatoire comprise entre −2 et 2.from random import random x=random() print(x) x2=4*x-2 print(y)
- On va donc tirer au hasard des points M(x;y) dans notre carré.
À quelle condition un point M(x;y) tiré est-il à l'intérieur de ce cercle ? - Compléter le programme suivant qui tire au hasard des coordonnées x et y de points dans le carré et pour compter le nombre de ces points tirés qui sont dans le disque.
from random import random n=int(input("Nombre points ? n= ")) c=0 for i in range(n): x= ... y= ... if ( ... ): ... print("Nombre de points dans le disque:",...) print("Ratio:", ... ) print("Approximation de l'aire du disque:") print( ... )
Aires sous une courbe
On a utilisé une méthode de Monte-Carlo pour calculer l'aire d'un disque.En fait, on connaissait, bien sûr, déjà cette aire. On peut alors penser à utiliser cette méthode pour calculer des aires qu'on ne sait pas encore calculer. Par exemple, l'aire d'une surface délimitée par une parabole.
Nombre de points dedans:
Ratio:
Aire:
Exercice 6:
On procède comme dans l'exercice précédent.
La fonction
La fonction
random()
de Python permet toujours de tirer un nombre x aléatoire, et uniformément, entre 0 et 1, donc la variable x2=2*x nous donne un nombre aléatoire comprise entre 0 et 2.
-
Rappeler la définition de la courbe représentative de la fonction f.
À quelle condition sur ses coordonnées un point M(x;y) tiré est-il sous la parabole, dans le domaine qui nous intéresse ici ? - Compléter alors le programme suivant et donner une approximation de l'aire recherchée.
from random import random n=int(input("Nombre points ? n= ")) c=0 for i in range(n): x= ... y= ... if ( ... ): ... print("Nombre de points sous la parabole:",...) print("Ratio:", ... ) print("Approximation de l'aire:") print( ... )
Dessins aléatoires, ou pas - Jeu du chaos
Pour tracer des graphiques, on peut utiliser la bibliothèque pylab, qui s'utilise de même que la bibliothèque random.On débute chaque programme par la ligne
from pylab import *
qui permet de charger la bibliothèque en question.
Ensuite, on peut par exemple placer le point de coordonnées x et y en utilisant la commande
plot(x,y,"*")
On pourra (re)voir aussi graphiques en python.
Triangle de Sierpiński
Exercice 7:
On considère le triangle ABC dont les sommets sont
A(0;0),
B(1;0)
et
C(0;1).
- Tracer les trois points A, B, C. Qu'affiche le programme suivant ? L'exécuter ensuite pour vérifier.
- On considère de plus le point M(0,5 ; 0,5).
Tracer ce point sur le graphique. - On désigne au hasard un des trois sommets A, B ou C
(ou sommet 1, 2 ou 3. On peut penser à tirer un dé à 3 faces en Python pour le choix aléatoire).
Calculer les coordonnées du point N, milieu du point choisi précédemment et du point M.
Tracer ce point N sur le graphique. - Le nouveau point M est maintenant le point N.
Répéter alors ce programme 10 fois: choix au hasard d'un sommet A, B ou C, puis calcul et tracer du point N, milieu de ce sommet et du point M, puis enfin M=N. - Que devient cette figure en traçant 100 fois le point N ? 1000 fois ? 10 000 fois ?
Courbe du dragon
Exercice 8:
On part pour cette construction du point A(1;1).
Pour chaque point M(x; y) on constuit le point N(xN; yN) de la façon suivante:
On tire à pile ou face (ou, en python, un "dé à deux faces") et
Pour chaque point M(x; y) on constuit le point N(xN; yN) de la façon suivante:
On tire à pile ou face (ou, en python, un "dé à deux faces") et
- si on obtient "Pile", alors
N a pour coordonnées
xN = x − y2 et yN = x + y2
- si on obtient "Face", alors
N a pour coordonnées
xN = 1 − x + y2 et yN = x − y2
- Calculer les coordonnées du point N construit à partir du point A.
- Tracer le point A sur un graphique en Python.
- Comme dans l'exercice précédent dans la construction du triangle de Sierpiński, construire sur le graphique en Python 10 points successivement:
- le point N construit à partir du point A.
- le point M précédent devient maintenant le point N et on construit le point M obtenu à partir de ce point N.
- le point M précédent devient maintenant le point N et on construit le point M …
- Tracer 100 points, 1000 points, ... avec la construction précédente.
- Modifier le graphique pour tracer tous les points obtenus en ayant tirer Pile de couleur bleue, et tous ceux obtenus en ayant tirer Face de couleur rouge.
Courbe du crabe (ou courbe de Lévy)
Exercice 9:
On reprend toute la construction de la courbe du dragon de l'exercice précédent, en modifiant seulement la règle de construction du point
N(xN; yN) à partir du point M(x; y).
On tire de même à pile ou face et
On tire de même à pile ou face et
- si on obtient "Pile", alors
N a pour coordonnées
xN = x − y2 et yN = x + y2
- si on obtient "Face", alors
N a pour coordonnées
xN = 12 + x + y2 et yN = 12 − x − y2
Courbe de Barnsley
Exercice 10:
On procède à nouveau de la même fa¸on que dans les courbes des exercices précédents.
Pour la courbe de Barnsley, la règle de construction du point N(xN; yN) à partir du point M(x; y).
Pour la courbe de Barnsley, la règle de construction du point N(xN; yN) à partir du point M(x; y).
- avec une probabilité de 1%, le point N a pour coordonnées
xN = 0 et yN = 0,16y
- avec une probabilité de 85%, le point N a pour coordonnées
xN = 0,85x + 0,04y et yN = −0,04x + 0,16y + 1,6
- avec une probabilité de 7%, le point N a pour coordonnées
xN = 0,20x − 0,26y et yN = 0,23x + 0,22y + 1,6
- avec une probabilité de 7%, le point N a pour coordonnées
xN = −0,15x + 0,28y et yN = 0,26x + 0,24y + 0,44
On peut trouver ainis bien d'autres images / constructions fractales.
Voir aussi:
* référence à l'essai "Le Hasard et la Nécessité" du biologiste Jacques Monod paru en 1970, et qui place le hasard au centre de la biologie moderne.