Générateur de nombres pseudo-aléatoires et principe de reproductibilité

Terminale Technologique · Mathématiques STI2D Terminale

À retenir

• Un générateur pseudo-aléatoire calcule u_n+1 = f(u_n) à partir d'une graine : il est déterministe. • Graine fixée suite identique : c'est la condition de reproductibilité d'un rapport. • Sur [0\,;\,1[, on doit avoir E = 0,5 et = 112 0,2887. • 0 et 1 ne sont pas atteints : le tirage uniforme est défini sur [a\,;\,b[. • Un écart entre deux simulations se juge en nombre d'écarts-types, jamais en valeur absolue.

Le cours

1. Un générateur est une machine à états Un générateur de nombres pseudo-aléatoires ne tire pas au sort : il calcule. Il part d'un entier appelé graine, et chaque nouveau nombre est obtenu par une règle déterministe appliquée au précédent : u_n+1 = f(u_n\,;\,n). L'aléa n'est donc qu'au choix de la graine. Trois qualités sont attendues d'un bon générateur : • Uniformité : les valeurs tombent dans [0\,;\,1\,[ avec la même densité partout, sans préférence pour 0,1 que pour 0,75. • Indépendance : connaître les n premières valeurs n'apporte aucune information sur la suivante. • Reproductibilité : à graine fixée, la suite est rigoureusement identique, sur n'importe quelle machine. La troisième qualité est la condition de validité d'un rapport de simulation : sans elle, un résultat simulé n'est pas opposable. 2. Fixer la graine et les six premières valeurs La graine est le seul paramètre qui rend le hasard « reproductible ». Avec la graine 2024, deux programmes différents donnent la même liste ; avec une autre graine, ils donnent autre chose. from random import Random def tirages(graine, nombre): r = Random(graine) # la graine fixe l'état initial return [r.random() for _ in range(nombre)] print(tirages(2024, 6)) # [0.470091, 0.728264, 0.303751, 0.887298, 0.410089, 0.716614] print(tirages(2024, 6) == tirages(2024, 6)) # True RangGraine 2024Graine 7 10,4700910,323833 20,7282640,150849 30,3037510,650934 40,8872980,072436 50,4100890,535882 60,7166140,365689 3. Les trois tests avant de croire une simulation 1. Moyenne : pour N valeurs uniformes sur [0\,;\,1\,[, elle doit tendre vers 0,5. Sur 200\,000 tirages, on obtient 0,50047. 2. Écart-type : il doit tendre vers 112 = 0,28868. On obtient 0,28879, soit 0,04\ \% d'écart relatif. 3. Étendue : le minimum vaut 0,0000004 et le maximum 0,9999965. Les bornes 0 et 1 ne sont pas atteintes : un intervalle fermé n'est pas un modèle exact du tirage. Si l'un des trois tests échoue, ce n'est pas le modèle qu'il faut corriger, mais le générateur. Changer de graine et recommencer : les résultats doivent rester du même ordre de grandeur. 4. Pièges • Oublier la graine : le rapport contient un résultat que l'on ne saura pas reproduire, et un correcteur ne pourra pas le vérifier. La graine se note avec le nombre de simulations et l'identifiant de la version du programme. • Appeler random() sans créer d'instance explicite : la graine est alors celle de l'environnement, variable d'une machine à l'autre. • Conclure à un biais parce que deux graines donnent 0,0352 et 0,0408 : l'écart de 0,0056 représente 2,0 écart-types d'estimation, ce qui arrive dans 4\ \% des cas avec un générateur parfaitement correct.

Dans ce chapitre