/* ** longrand() -- generate 2**31-2 random numbers ** ** public domain by Ray Gardner ** ** ported to BZ by Stig Johansen, 9514.14 ** ** I can be reached at these e-addresses: ** BBBSnet: Stig Johansen@47:1000/101 ** FidoNet: Stig Johansen@2:210/20 ** SigNet: Stig Johansen@27:1347/106 ** SkyNet: Stig Johansen@47:300:110 ** ** based on "Random Number Generators: Good Ones Are Hard to Find", ** S.K. Park and K.W. Miller, Communications of the ACM 31:10 (Oct 1988), ** and "Two Fast Implementations of the 'Minimal Standard' Random ** Number Generator", David G. Carta, Comm. ACM 33, 1 (Jan 1990), p. 87-88 ** ** linear congruential generator f(z) = 16807 z mod (2 ** 31 - 1) ** ** uses L. Schrage's method to avoid overflow problems */ var $a; /* multiplier */ var $m; /* 2**31 - 1 */ var $q; /* m div a */ var $r; /* m mod a */ function nextlongrand($seed) { var $lo, $hi; $lo = ($a * ($seed & 65535)); $hi = ($a * ($seed >> 16)); $lo = ($lo+( ($hi & 32767) << 16)); if ($lo > $m) { $lo = $lo & $m; $lo = $lo+1; } $lo = $lo+($hi >> 15); if ($lo > $m) { $lo = $lo & $m; $lo=$lo+1; } return ($lo); } var $randomnum; function longrand() /* return next random long */ { $randomnum = nextlongrand($randomnum); return ($randomnum); } function slongrand($seed) /* to seed it */ { $a=16807; $m=2147483647; $q=127773; $r=2836; $randomnum = 1; if ($seed) $randomnum = ($seed & $m); else $randomnum = 1; /* nonzero seed */ }