Générateur congruentiel linéaireUn générateur congruentiel linéaire est un générateur de nombres pseudo-aléatoires dont l'algorithme, introduit en 1948 par Derrick Lehmer, sous une forme réduite, pour produire des nombres aléatoires, est basé sur des congruences et une fonction affine. DéfinitionLes nombres pseudo aléatoires forment une suite dont chaque terme dépend du précédent, selon la formule : où a est le multiplicateur, c l'incrément et m le module. Le terme initial est appelé la graine (seed en anglais). C'est elle qui va permettre de générer une suite apparemment aléatoire. Pour chaque graine, on aura une nouvelle suite. Cependant, il est possible que certaines graines permettent d'obtenir une suite plus aléatoire que d'autres. Du fait de l'opération mod (reste dans la division euclidienne de par m), les termes de cette suite sont compris entre 0 et . De plus, comme chaque terme dépend entièrement du précédent, si un nombre apparaît une deuxième fois, toute la suite se reproduit à partir de ce nombre. Or le nombre de valeurs que le nombre peut prendre étant fini (égal à m), la suite est amenée à se répéter au bout d'un certain temps. On dit qu'elle est ultimement périodique. Du bon choix des paramètres a, c et mDans ce type d'algorithme, la qualité du générateur va entièrement dépendre du choix de a, c et m car on ne peut pas se satisfaire d'un générateur qui produit des suites plus ou moins aléatoires, sans aucune raison apparente, selon le choix de X0. Un mauvais exempleChoisir les valeurs a, c et m « au hasard » n'est pas une bonne idée. Prenons un exemple, soit le générateur congruentiel linéaire employant les valeurs a = 25, c = 16, m = 256, nous obtenons :
Il est clair que ces suites ne peuvent être considérées comme aléatoires. Choix du moduleLes générateurs congruentiels font intervenir un calcul modulo m, et donc a priori une division euclidienne, ce qui peut avoir un coût de calcul important dans le cadre d'une utilisation fréquente du générateur. La solution la plus simple est d'utiliser un module de type m = 2e. En effet, les ordinateurs calculant naturellement en base binaire, un tel choix est tout à fait transparent pour eux, ce qui rend inutile une division euclidienne. Toutefois, ce choix présente une limite importante : les bits dits de poids faible (les bits les plus à droite) sont beaucoup moins aléatoires que ceux de la partie de poids fort (les bits les plus à gauche). En effet, si d est un diviseur de m, alors la suite Yn, telle que : satisfait à la suite congruentielle linéaire : en particulier, avec d = 2k, pour k fixé, compris entre 1 et e, on voit que les k chiffres de poids faible, ont une période maximale de 2k, évidemment inférieure à m. Une autre solution consiste à prendre un module du type , ce qui permet encore d'éviter une division euclidienne par une astuce (cf. The Art Of Computer Programming de D. E. Knuth). Choix du multiplicateur et de l'incrémentAfin de pouvoir choisir une graine sans contraintes entre et , il faut chercher à maximiser la période du générateur. Or il se trouve que les valeurs de et sont connues, ce qui permet d'obtenir une période maximale (égale à ). Si la période d’un générateur congruentiel linéaire est maximale si et seulement si :
On remarquera que l'on possède un théorème d'équivalence (si et seulement si) : la période est maximale pour toutes les valeurs qui possèdent les propriétés du théorème et seulement pour celles-là. On possède, de plus, de conditions suffisantes dans le cas particulier où c est nul. Ainsi, pour c nul la période d'un générateur congruentiel linéaire est maximale si[citation nécessaire] :
Attention: ce n'est pas une équivalence ! Le potentielLe potentiel est une notion qui permet d'écarter certains générateurs insuffisamment aléatoires. Il est toujours défini que pour une suite possédant une période maximale (et ce, d'après la deuxième propriété énoncée plus haut). On ne peut pas toujours le définir sur les autres générateurs, et il existe de bons générateurs sur lesquels le potentiel n'est pas défini. Le potentiel d’une suite possédant une période maximale est défini comme le plus petit entier tel que : Pour une suite de période maximale, on peut prendre , et donc : ainsi, avec : et un potentiel inférieur ou égal à trois, apparaît immédiatement comme trop faible car la suite n’est pas suffisamment aléatoire. En fait un potentiel de 5 ou plus est conseillé. Rappelons cependant que la notion de potentiel est uniquement là pour écarter quelques mauvais générateurs. Un générateur possédant un potentiel supérieur à 5 ne peut en aucun cas être d’emblée considéré comme bon, il doit d’abord subir quelques tests. Tests statistiquesComme 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, ... ; Exemples
. 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 exemplesKnuth 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 :
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 :
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 32768 fois dans la suite. Un autre exemple serait de mixer la sortie d'un générateur congruentiel linéaire et d'un registre à décalage à rétroaction linéaire[1]. Références
Voir aussiBibliographie(en) Donald E. Knuth, The Art of Computer Programming, vol. 2 : Seminumerical Algorithms, 3e éd., Addison-Wesley, Boston, 1998 Articles connexes |