Générateur congruentiel linéaire - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Exemples

Algorithme a c m Remarques
RANDU 65539 0 231 Biaisé et fortement déconseillé
générateur de Robert Sedgewick 31415821 1 108 Intéressant mais déconseillé (essayer avec X_0 = 0~ )
Standard minimal 16807 0 231-1
  • RANDU défini par X_{n+1} = 65539 X_n \mod 2^{31} . Implanté sur les IBM System/370 et réputé mauvais par tous ceux qui ont à l'utiliser sérieusement
  • Le générateur de Turbo Pascal défini par X_{n+1} =(129 X_n + 907633385) \mod 2^{32} . On sait dans 1 cas sur 129 que Xn + 1 > Xn, ce qui est un biais énorme pour une application scientifique. En plus comme 129 est de la forme 2^n + 1, les nombres produits ne sont pas si « aléatoires que ça » [cf. Knuth p.23].
  • Le générateur d'UNIX (dont le comité ANSI C a heureusement recommandé de ne conserver que les 16 bits de poids fort) :

X_{n+1} = (1103515245 X_n + 12345) \mod 2^{31} . Même la documentation du Berkeley 4.2 admet que les bits de poids faible des nombres produits ne sont pas vraiment aléatoires.

autres exemples

D. Knuth recense dans « Seminumerical Algorithms » un certain nombre de générateurs congruentiels linéaires de qualité. S'il n'est pas possible d'utiliser le Standard Minimal, on pourra essayer par exemple :

  • X_{n+1} = ( 137 X_n + 187 ) \mod 2^8 (une suite cyclique de 256 nombres, est-ce encore du hasard ?)
  • X_{n+1} = ( 1664525 X_n + 1013904223 ) \mod 2^{32}  : générateur de Knuth & Lewis
  • X_{n+1} = 69069 X_n \mod 2^{32}  : générateur de Marsaglia au multiplicande remarquable, utilisé sur le VAX
  • X_{n+1} = 31167285 X_{n+1} \mod 2^{48}  : générateur de Lavaux & Jenssens
  • X_{n+1} = 6 364 136 223 846 793 005 X_{n+1} \mod 2^{64}  : générateur de Haynes

Dans tous ces cas, comme le modulant est une puissance de 2, les bits de poids faible des nombres produits ne sont pas eux très « aléatoires ». Il est par conséquent préférable de ne conserver que les poids forts (16 bits par exemple), comme le fait le générateur de Borland C++ par exemple :

  • X_{n+1} = (22 695 477 X_n+1 ) \mod 2^{32} et on sort Xn + 1 > > 16

Ce faisant, la période du générateur reste la même mais on ne va produire que des nombres compris entre 0 et 65535, chacun se retrouvant 65536 fois dans la suite.

Tests statistiques

Comme tous les générateurs de nombres pseudo-aléatoires, le générateur congruentiel linéaire doit être soumis à une série de tests avant d’être homologué.

Le plus connu d’entre eux, le test de fréquence n'est généralement pas un problème pour un générateur congruentiel linéaire de période maximale, mais il existe bien d'autres tests. Test des séries, Gap test, Run test, ...
L'un des plus discriminant, car aucun générateur congruentiel linéaire démontré mauvais ne l’a réussi, étant le test spectral.

Page générée en 0.124 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales
Version anglaise | Version allemande | Version espagnole | Version portugaise