Commit d1ab4ede authored by Richard M. Stallman's avatar Richard M. Stallman
Browse files

(Frandom): Handle LIMIT >= 40000000.

parent 8581f180
......@@ -64,17 +64,23 @@ With argument t, set the random number seed from the current time and pid.")
srandom (getpid () + time (0));
if (XTYPE (limit) == Lisp_Int && XINT (limit) > 0)
{
/* Try to take our random number from the higher bits of VAL,
not the lower, since (says Gentzel) the low bits of `random'
are less random than the higher ones. We do this by using the
quotient rather than the remainder. At the high end of the RNG
it's possible to get a quotient larger than limit; discarding
these values eliminates the bias that would otherwise appear
when using a large limit. */
denominator = (unsigned long)0x40000000 / XFASTINT (limit);
do
val = (random () & 0x3fffffff) / denominator;
while (val >= limit);
if (XINT (limit) >= 0x40000000)
/* This case may occur on 64-bit machines. */
val = random () % XINT (limit);
else
{
/* Try to take our random number from the higher bits of VAL,
not the lower, since (says Gentzel) the low bits of `random'
are less random than the higher ones. We do this by using the
quotient rather than the remainder. At the high end of the RNG
it's possible to get a quotient larger than limit; discarding
these values eliminates the bias that would otherwise appear
when using a large limit. */
denominator = (unsigned long)0x40000000 / XFASTINT (limit);
do
val = (random () & 0x3fffffff) / denominator;
while (val >= limit);
}
}
else
val = random ();
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment