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 ();