program randtest;
var seed: double;
    i: integer;
    temp: double;
    COUNT: integer;
    x, y: double;

function random(var seed: double): double;
(* return a random double precision real
 * between 0 and 1.  Update parameter seed
 *)
const
   a = 16807.0;      (* multiplier *)
   m = 2147483647.0; (* modulus *)
     (* on the VAX, this must be 2147483647.0D0 *)
   q = 127773.0;     (* m div a *)
   r = 2836.0;       (* m mod a *)
var
   lo, hi, test: double;
begin
   hi := trunc(seed/q);
   lo := seed - q*hi;
   test := a*lo - r*hi;
   if test > 0.0 then
      seed := test
   else
      seed := test + m;
   random := seed/m
end; (* random *)

begin
   seed := 1.0;
   for i := 1 to 100000 do
      temp := random(seed);
   writeln('Seed:', seed:18:6, ', should be 46831694.000000');
   (* part (a) *)
   for i := 1 to 10 do
      writeln('Random real:',random(seed):20:17,
          ', Seed:', seed:12:0);
   (* part (b) *)
   if random(seed) < 0.5 then
      writeln('HEADS')
   else writeln('TAILS');
   (* part (c) *)
   COUNT := 0;
   for i := 1 to 1000 do
   begin
      x := random(seed) - 0.5;
      y := random(seed) - 0.5;
      if sqr(x) + sqr(y) <= 0.25 then
         COUNT := COUNT + 1
   end;
   writeln(COUNT/1000:20:10,
     ' Exact value:', 3.14159265358979/4.0:20:10);
   writeln('Th-th-th-th-that''s-all-folkes!')       
end.
