STH2, Maple Générateurs de nombres aléatoires 2012 Un générateur de nombre aléatoire est une procédure permettant de reproduire le hasard. Plus précisemment, on souhaite construire un programme qui génère des nombres entre 0 et 1 selon la loi uniforme. Le modèle que nous allons étudier ici est celui des générateurs congruentiels linéaires. Ce sont des suites dénies pour des entiers u0 ≤ n, et a, c n et par ∀k ≥ 0, uk+1 = auk + c mod n. uk est alors une suite de nombres dans [0, 1]. L'objectif est que cette suite n ressemble à une suite aléatoire de nombres. Cela signie entre autres que les diérents termes La suite des de la suite doivent avoir l'air indépendants les uns des autres. L'objectif de ce projet est de tester la qualité de plusieurs générateurs en étudiant leurs propriétés statistiques et en les comparant à celles de la loi uniforme. 1. Construction des générateurs. Nous étudierons plusieurs générateurs de nombres aléatoires : Le générateur Randu développé par IBM dans les années 60 déni par la suite récurrente uk+1 = 65539uk mod 231 avec u0 impair. 32 Le générateur de Turbo Pascal : uk+1 = 129uk + 907633385 mod 2 . 32 Le générateur de Marsaglia : uk+1 = 69069uk mod 2 . rand() . Le générateur de Maple donné par 1012 (a) Expliquer pourquoi le choix de n est toujours une puissance de 2. u. Écrire, pour chaque générateur étudié, un programme Rand() u en au + c mod n. La variable u sera déclarée dans ce programme (b) Fixer une variable qui transforme comme une variable globale et non locale. (c) Écrire des programmes Liste(N) qui génèrent des suites de nombres tirés à l'aide des programmes précédents. 2. Moyenne et loi forte des grands nombres. La loi forte des grands nombres arme que si on tire des nombres xk selon la loi uniforme, PN 1 1 alors les moyennes k=1 xk convergent vers 2 , quand N tend vers +∞. N Vérier cela expérimentalement pour les générateurs étudiés. 3. Densité. (a) Des nombres tirés selon la loi uniforme s'équirépartissent dans l'intervalle [0, 1]. Cela signie qu'ils remplissent l'intervalle de manière homogène. Tester cela pour les générateurs avec la fonction pointplot. x selon la loi uniforme, la probabilité que x soit dans un sous-intervalle [a, b] de [0, 1] est égale à b − a. Concrètement, si on tire N nombres K aléatoirement, et si on note KN le nombre de ceux qui sont dans [a, b], alors N tend N vers b − a quand N tend vers +∞. (b) Si on tire un nombre Tester expérimentalement cela avec les générateurs. 1 (c) Donner des exemples d'intervalles pour lesquels les probabilités obtenues avec les générateurs ne peuvent être que fausses. 4. Fonction de répartition et test de Kolmogorov-Smirnov. La fonction de répartition est la fonction qui à au hasard soit inférieur à x. x associe la probabilité qu'un nombre tiré Pour la loi uniforme, cette fonction est donnée sur [0, 1] par F (x) = x. (a) Écrire un programme Répartition(l) qui pour une liste de nombres dans k la fonction dénie sur [0, 1] par Fl (x) = où N nombre d'éléments de la liste inférieurs à x. (b) Pour chaque générateur, écrire un programme N est la taille de la [0, 1], trace liste et k est le Kolmogorov(N) qui calcule, pour une l de N nombres générés, la borne supérieure εN = sup |Fl (x) − F (x)| avec F (x) = x. suite Autrement dit, ce programme compare la fonction de répartition empirique obtenue εN doit être faible. Le test de Kolmogorov-Smirnov précise cela : pour chaque valeur de N , il existe une 5%) que à la fonction de répartition théorique. Si le générateur est correct, valeur dN telle que si ε > dN , alors on peut considérer (avec un risque de les nombres générés ne le sont pas selon la loi uniforme. Donnons quelques valeurs : d20 = 0.294, d50 = 0.188, d100 = 0.150 et pour 1.358 N > 100, dN = √ . N (c) Appliquer le test de Kolmogorov-Smirnov aux générateurs étudiés. 5. Indépendance. On souhaite que les diérents tirages eectués avec les générateurs soient deux à deux indépendants. Cela signie vulgairement qu'une valeur obtenue pour un tirage n'a aucune inuence sur les valeurs obtenues pour d'autres tirages. (a) Expliquer pourquoi les tirages successifs eectués avec des générateurs congruentiels linéaires ne peuvent pas être indépendants. Ils peuvent cependant avoir l'air indépendants. Si on considère une suite (xk ) de nombres indépendants tirés selon la loi uniforme et si on considère les couples (xk , xk+1 ) dans le carré [0, 1]2 , alors ceux-ci sont équirépartis dans le carré. Si un générateur est correct, on retrouve cette propriété. (b) Tester ainsi l'indépendance des tirages successifs des générateurs. (c) Faire de même avec les triplets de tirages sucessifs. (d) Pour le programme Randu, représenter les points de la forme (6xk+1 − 9xk , xk+2 ). Qu'en déduit-on ? L'indépendance est le point le plus délicat de la simulation de nombre aléatoires. Il existe des tests plus subtils et plus précis que ceux évoqués ici comme le test du chi 2 et le test du poker. 2 6. Bonus. (a) Posons c, n = 28 = 256. Écrire un programme qui trouve les meilleures valeurs de a et selon des critères à choisir, pour dénir un générateur congruentiel correct. (b) Une idée souvent utilisée pour générer de l'aléatoire est d'utiliser l'horloge de l'ordinateur. Avec Maple, on peut faire appel à la fonction time[real]() et ne garder que la partie décimale des valeus obtenues. Écrire un programme qui génère ainsi des nombres aléatoires. Montrer que ce générateur peut être très mauvais dans certaines utilisations. Fonctions utiles : pointplot, seq, pointplot3d, rand 3