Mercurial > emacs
changeset 8388:e0c0247dca19
(Frandom): Handle LIMIT >= 40000000.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sat, 30 Jul 1994 21:17:41 +0000 |
parents | 7dca276b66d8 |
children | 298183d131b1 |
files | src/fns.c |
diffstat | 1 files changed, 17 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/fns.c Sat Jul 30 21:11:00 1994 +0000 +++ b/src/fns.c Sat Jul 30 21:17:41 1994 +0000 @@ -64,17 +64,23 @@ 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 ();