### (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!