-- RT_C132A4A1 : Lecture des 20 premieres valeurs
--               du GPA Wichmann & Hill
-- Coyright Jacques-deric Rouault
-- Version 1.1 du 2012030.5
              
WITH Text_io;
USE  Text_io;

PROCEDURE RT_C132A4A1 IS
      
  PACKAGE  IIO IS NEW Integer_io (Integer);
  PACKAGE  FIO IS NEW Float_io (Float);
  
  randomx : INTEGER := 10_001;
  randomy : INTEGER := 20_001;
  randomz : INTEGER := 30_001;
  
  ax:CONSTANT INTEGER := 171;
  bx:CONSTANT INTEGER := 177;
  cx:CONSTANT INTEGER := 30269;
  fx:CONSTANT FLOAT   := 30269.0;
  ay:CONSTANT INTEGER := 172;
  by:CONSTANT INTEGER := 176;
  cy:CONSTANT INTEGER := 30307;
  fy:CONSTANT FLOAT   := 30307.0;
  az:CONSTANT INTEGER := 170;
  bz:CONSTANT INTEGER := 178;
  cz:CONSTANT INTEGER := 30323;
  fz:CONSTANT FLOAT   := 30323.0;
  
  val : Float;

  Probleme : EXCEPTION;

------------------------------------------------------------------------------

  FUNCTION wichmann_hill RETURN FLOAT IS
  --  Version 1.1 du 26 janvier 1995

    w : FLOAT;

  BEGIN

    randomx:= ax*((randomx mod bx)-bx) - 2*(randomx/bx);
    IF randomx<0 THEN randomx:=randomx+cx; END IF;
    randomy:= ay*((randomy mod by)-by) - 2*(randomy/by);
    IF randomy<0 THEN randomy:=randomy+cy; END IF;
    randomz:= az*((randomz mod bz)-bz) - 2*(randomz/bz);
    IF randomz<0 THEN randomz:=randomz+cz; END IF;
    w:=FLOAT(randomx)/fx+FLOAT(randomy)/fy+FLOAT(randomz)/fz;
    RETURN w-FLOAT(INTEGER(w-0.5));

  END wichmann_hill;

------------------------------------------------------------------------------
  
BEGIN

  Put_line ("Debut d'execution du programme Ada RT_C132A4A1");
  
  FOR n IN 1..20 LOOP
    val:=wichmann_hill;
    iio.put (n,4);
    put (" - ");
    fio.put (val,3,7,0); 
    new_line;  
  END LOOP;  
  
  Put_line ("Fin   d'execution du programme Ada RT_C132A4A1");
  
  EXCEPTION
    WHEN probleme =>
      Put_line ("ERREUR : PROBLEME CALCUL Generateur_Pseudo_Aleatoire");
  
END RT_C132A4A1;