Les Chevaliers de Malte/Développeur - Ada - Mathématique - Random


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 Ada:
WITH TEXT_IO; 

PROCEDURE RandomStatic IS 
   USE TEXT_IO; 
   
   M : CONSTANT := 100000000;
   Ml : CONSTANT := 10000;
   B  : CONSTANT := 31415821;
   
   A:Integer:=1;
   
   FUNCTION Mult(P,Q:IN Integer) RETURN Integer IS
      Pl,P0,Ql,Q0:Integer;
   BEGIN      
      Pl:=P / Ml;      
      P0:=P mod Ml;      
      Ql:=Q / Ml;      
      Q0:=Q mod Ml;      
      RETURN (((P0*Ql+Pl*Q0) mod Ml)*Ml+P0*Q0) mod M;      
   END Mult;
   
   FUNCTION Random RETURN Integer IS BEGIN
      A:=(Mult(A,B)+1) mod M;
      RETURN A;
   END Random;
   
BEGIN
   PUT_LINE("Génération de 10 nombres aléatoires statique:");   
   FOR I IN 1..10 LOOP
      PUT_LINE(INTEGER'IMAGE(Random));
   END LOOP;
END RandomStatic;

on obtiendra le résultat suivant:
Génération de 10 nombres aléatoires statique:
31415822
40519863
62952524
25482205
90965306
70506227
6817368
12779129
29199910
45776111
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.



Voir également

Science - Mathématique

Dernière mise à jour: Vendredi, le 10 mars 2006