Contributor: BRIAN RICHARDSON         

{
 HG> Did any one have an algorithm to generate random numbers?
 HG> I know Borland Pascal have de function RANDOM but what I realy
 HG> want is the code to do that. Any Language is ok, but I prefer
 HG> Pascal.

 Here's a small random number unit that is quite good..
}

unit Random;

interface

procedure SeedRandomNum(ASeed : word);
procedure InitRandom;
function  RandomNum : word;
function  RandomRange(ARange : word): word;

implementation

var
   Fib   : array[1..17] of word;
   i, j  : word;

procedure SeedRandomNum(ASeed : word);
var x : word;
begin
   Fib[1] := ASeed;
   Fib[2] := ASeed;
   for x := 3 to 17 do
      Fib[x] := Fib[x-2] + Fib[x-1];
   i := 17;
   j := ASeed mod 17;
end;

procedure InitRandom;
begin
   SeedRandomNum(MemW[$40:$6C]);
end;

procedure SeedRandom(ASeed : word);
var x : word;
begin
   Fib[1] := ASeed;
   Fib[2] := ASeed;
   for x := 3 to 17 do
      Fib[x] := Fib[x-2] + Fib[x-1];
   i := 17;
   j := ASeed mod 17;
end;

function RandomNum : word;
var k : word;
begin
   k := Fib[i] + Fib[j];
   Fib[i] := k;
   dec(i);
   dec(j);
   if i = 0 then i := 17;
   if j = 0 then j := 17;
   RandomNum := k;
end;

function RandomRange(ARange : word): word;
begin
   RandomRange := RandomNum mod ARange;
end;

end.