(*$I+   [include Pascal prgm stmts]     *)
Program RandomDummy;
var     SEED1, SEED2 : INTEGER;
(*
==============================================
PROGRAM TITLE: Random Number Generator

WRITTEN BY:    Raymond E. Penley
DATE WRITTEN:  27 June 1980

WRITTEN FOR:   Pascal/Z Users Group

SUMMARY:
       Implements a Fibonacci series Random number generator.
       RANDOM will return numbers from 0 to x

               Call as                   Returns
               -------                 ------------
           real := RANDOM(10);         0.0 to 10.0
           real := RANDOM(112);        0.0 to 112.0
            I := TRUNC(RANDOM(10));      0 to 10

**
 Add these lines to your PASCAL source program:

   Procedure SEEDRAND; EXTERNAL;
   Functin RANDOM(X: Integer): REAL; external;

 Also within the body of the main program
 but BEFORE calling RANDOM(X);

         SEEDRAND;

==============================================
*)

PROCEDURE SEEDRAND;
(* INITIAL VALUES FOR SEED1 AND SEED2 ARE HERE  *)
(*
       NAME RANDOM
       ENTRY SEEDRAND,RANDOM

SEEDRAND:
*)
Begin
  SEED1 := 10946;
  SEED2 := 17711
END;



Function Random(x: integer): real;
(*
GLOBAL
 SEED1, SEED2 : INTEGER                *)
CONST
 factor = Maxint;
 HALFINT = 16383; (* 1/2 OF MAXINT *)
VAR
 x1 : real;
 temp1, temp2, HALF_ADDER : INTEGER;
(*
RANDOM:
*)
Begin
(* Take 1/2 of the seeds for the comparison test *)
 temp1 := SEED1 DIV 2;
 temp2 := SEED2 DIV 2;
 IF (temp1+temp2) >= HALFINT then{the number is too big -}
   { scale it down }
   HALF_ADDER := temp1 + temp2 - HALFINT
 ELSE
   HALF_ADDER := temp1 + temp2;
 SEED1 := SEED2;
 (* Restore from previous DIVision *)
 SEED2 := HALF_ADDER * 2;
 (*---Convert X to real and divide by factor---*)
 x1 := ((X*1.0)/factor);
 (*---Return random number scaled by factor---*)
 RANDOM := ( SEED2 * x1 );
End{ of RANDOM(X) };
(*$I-   [turn off now]  *)

(*---dummy program---*)
begin end.