Chapitre 1
Génération de variables aléatoires
Introduction
Idéalement, une méthode Monte-Carlo repose sur la simulation d’une suite de variables aléatoires
(Xn)n≥1indépendantes et identiquement distribuées (i.i.d.) selon une loi donnée. Ce chapitre
expose quelques méthodes pour y parvenir, au moins de façon approchée, en commençant par la
loi uniforme, sur laquelle toutes les autres sont basées.
1.1 Variables uniformes
Le but est de générer une suite de variables aléatoires (Xn)n≥1indépendantes et de loi uniforme
sur [0,1]. Ceci est bien entendu impossible sur un ordinateur : d’abord parce que les nombres entre
0 et 1 sont en fait de la forme k/2pavec k∈ {0,...,2p−1}; ensuite parce que vérifier qu’une suite
(Xn)n≥1est bien i.i.d. est une question très délicate. C’est essentiellement l’objet de la théorie de
la complexité (voir par exemple [3], Chapitre 7, pour une introduction à ce sujet).
En pratique, les logiciels se basent sur une suite dite pseudo-aléatoire qui a la forme Xn=f(Xn−1)
avec Xn∈ {0,...,2p−1}. L’objectif est alors d’obtenir une suite (Xn)qui ressemble autant que
possible à une suite i.i.d. uniforme sur {0,...,2p−1}. La fonction fétant déterministe, il est clair
qu’un tel générateur est périodique. Il existe de nombreuses méthodes pour générer de telles suites
et nous ne détaillerons pas ce sujet, nous contentant de mentionner celui utilisé par défaut sous R
via la commande runif, à savoir le Mersenne Twister MT-19937 :
Xn+1 =AXn(mod 2)
où Xnest un vecteur de 19937 bits et Aune matrice bien choisie. La variable pseudo-aléatoire Un
correspond alors aux 32 derniers bits de Xn. Proposé par Matsumoto et Nishimura en 1998 [11],
ce générateur a une période de longueur 219937 −1(i.e. le maximum possible vu la taille de Xnet
le fait que 0 est un point fixe), lequel est un nombre premier de Mersenne.
Notons aussi que si, pour une raison ou une autre, on veut changer de générateur sous R, il suffit
de le spécifier avant l’appel à runif via la fonction RNGkind. En voici un exemple pour utiliser un
générateur proposé par L’Ecuyer :
> set.seed(123) # fixe la graine du générateur
> runif(1) # génération par Mersennne Twister
[1] 0.2875775
> RNGkind("L’Ecuyer-CMRG") # changement de générateur pseudo-aléatoire
> set.seed(123)
> runif(1)
1