[Back to NUMBERS SWAG index]  [Back to Main SWAG index]  [Original]

{
>  Having said that, I do think Pascal's random is random enough for
>most earthly purposes.  :)

You're excluding Nasa, I see ;-). Seriously, this is true only for
Borland's version 7. The version 6 generator is bad.

For the cases where the internal random is not good enough, here's my
choice for a 'serious' generator:

From: pierre.tourigny@bbs.synapse.net (Pierre Tourigny)
}

function ran1pt: real;
{adapted from ran1 in NRPAS13.ZIP (code for the book 
Numerical Recipes in Pascal); modified 94-03-25 by Pierre 
Tourigny, pierre.tourigny@bbs.synapse.net; Ran1pt calls 
Randomize if RANDSEED has not already been set}
const
  m1: longint = 259200; i1: longint = 7141; c1: longint = 54773;
  m2: longint = 134456; i2: longint = 8121; c2: longint = 28411;
  m3: longint = 243000; i3: longint = 4561; c3: longint = 51349;
  {static variables}
  x1: longint = 0; x2: longint = 0; x3: longint = 0;
  r: array [1..97] of real = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0);
  initialized: boolean = false;
var
  j: integer;
begin
if not initialized then begin
  if randseed = 0 then randomize
  else randseed := abs(randseed);
  x1 := (randseed+c1) mod m1;
  x1 := (x1*i1+c1) mod m1;
  x2 := x1 mod m2;
  x1 := (x1*i1+c1) mod m1;
  x3 := x1 mod m3;
  for j := 1 to 97 do begin
    x1 := (x1*i1+c1) mod m1;
    x2 := (x2*i2+c2) mod m2;
    r[j] := (x1+x2/m2)/m1;
    end;
  initialized := true;
  end;
x1 := (x1*i1+c1) mod m1;
x2 := (x2*i2+c2) mod m2;
x3 := (x3*i3+c3) mod m3;
j := 1 + (97*x3) div m3;
ran1pt := r[j];
r[j] := (x1+x2/m2)/m1;
end;

function ranlong(max: longint): longint;
begin ranlong := trunc(max * ran1pt) end;

[Back to NUMBERS SWAG index]  [Back to Main SWAG index]  [Original]