From: Richard M. Stallman Date: Sat, 30 Jul 1994 21:17:41 +0000 (+0000) Subject: (Frandom): Handle LIMIT >= 40000000. X-Git-Tag: emacs-19.34~7465 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=d1ab4ede1f214fa520b8f64d17ab3c36f1daf858;p=emacs.git (Frandom): Handle LIMIT >= 40000000. --- diff --git a/src/fns.c b/src/fns.c index c91710b7c10..b65f3f203f7 100644 --- a/src/fns.c +++ b/src/fns.c @@ -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 ();