Générateurs de nombres aléatoires - Jean

publicité
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
Téléchargement