[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]
(************************************* function Generate *************)
function Generate (var Seed: longint): real;
{ Algorithm 2 from CACM, pg. 1195, vol. 31, no. 10, (October, 1988). }
{ modified for longint values as recommended in Cooper, D. 1993 }
{ Oh! Pascal!, 3rd edition, pp. A16-A17 }
const
MODULUS = 2147483647;
MULTIPLIER = 16807;
QUOTIENT = 127773; {MODULUS div MULTIPLIER}
REMAINDER = 2836; {MODULUS mod MULTIPLIER}
var
Low, Hi, Test: longint;
begin
{First, perform the calculation while avoiding overflow.}
Hi := Seed div QUOTIENT;
Low := Seed mod QUOTIENT;
Test := (MULTIPLIER * Low) - (REMAINDER * Hi);
{Second, update the seed for next time.}
if Test > 0 then
Seed := Test
else
Seed := Test + MODULUS;
{Third, return a value in the range 0.0 < Generate < 1.0}
Generate := Seed / MODULUS;
end;
(************************************* function Generate end ***********)
[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]