Un algorithme fort simple mais de plus en plus rare dans les livres, s'est le fonctionnement d'une fonction de générateur aléatoire. Je n'ai, entre autre, trouvé la formule dans aucun livre à l'exception de «ALGORITHMS, 1983, Edition Addison-Wesley, par Robert Sedgewick, page 33 à 44». Voici un petit programme inspiré de se livre, permettant d'effectuer la génération de nombre aléatoire statique en QuickPascal:
Program RandomStatic;
Const
m=100000000;
ml=10000;
b=31415821;
a:Integer=1;
Function Mult(p,q:Integer):Integer;
Var
pl,p0,ql,q0:Integer;
Begin
pl:=p div ml;
p0:=p mod ml;
ql:=q div ml;
q0:=q mod ml;
Mult:=(((LongInt(p0)*LongInt(ql)+LongInt(pl)*LongInt(q0)) mod LongInt(ml))*LongInt(ml)+LongInt(p0)*LongInt(q0)) mod m;
End;
Function Random:Integer;Begin
a:=LongInt(Mult(a,Integer(b))+1) mod m;
Random:=a;
End;
Var
I:Integer;
BEGIN
WriteLn('Génération de 10 nombres aléatoires statique:');
For I:=1 to 10 do WriteLn(Random);
END.
on obtiendra le résultat suivant:
Génération de 10 nombres aléatoires statique:24078
-31305
9036
-3875
24890
-10509
-6568
-7303
-9178
-7185
Le résultat est toujours le même parce que la variable «a» contient invariablement la valeur 1 à chaque démarrage du programme. Pour changer cette situation, il faudra donc affecter le résultat d'une fonction d'horloge, comme «GetTickCount», pour provoquer une effet de «Randomize Timer» du bon vieux BASIC.