aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard M. Stallman1994-07-30 21:17:41 +0000
committerRichard M. Stallman1994-07-30 21:17:41 +0000
commitd1ab4ede1f214fa520b8f64d17ab3c36f1daf858 (patch)
tree8e22f761ea9b0787b136e8db908fc51f94f2544c /src
parent8581f180f14078c912bf5d8cb69394e79a838582 (diff)
downloademacs-d1ab4ede1f214fa520b8f64d17ab3c36f1daf858.tar.gz
emacs-d1ab4ede1f214fa520b8f64d17ab3c36f1daf858.zip
(Frandom): Handle LIMIT >= 40000000.
Diffstat (limited to 'src')
-rw-r--r--src/fns.c28
1 files changed, 17 insertions, 11 deletions
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.")
64 srandom (getpid () + time (0)); 64 srandom (getpid () + time (0));
65 if (XTYPE (limit) == Lisp_Int && XINT (limit) > 0) 65 if (XTYPE (limit) == Lisp_Int && XINT (limit) > 0)
66 { 66 {
67 /* Try to take our random number from the higher bits of VAL, 67 if (XINT (limit) >= 0x40000000)
68 not the lower, since (says Gentzel) the low bits of `random' 68 /* This case may occur on 64-bit machines. */
69 are less random than the higher ones. We do this by using the 69 val = random () % XINT (limit);
70 quotient rather than the remainder. At the high end of the RNG 70 else
71 it's possible to get a quotient larger than limit; discarding 71 {
72 these values eliminates the bias that would otherwise appear 72 /* Try to take our random number from the higher bits of VAL,
73 when using a large limit. */ 73 not the lower, since (says Gentzel) the low bits of `random'
74 denominator = (unsigned long)0x40000000 / XFASTINT (limit); 74 are less random than the higher ones. We do this by using the
75 do 75 quotient rather than the remainder. At the high end of the RNG
76 val = (random () & 0x3fffffff) / denominator; 76 it's possible to get a quotient larger than limit; discarding
77 while (val >= limit); 77 these values eliminates the bias that would otherwise appear
78 when using a large limit. */
79 denominator = (unsigned long)0x40000000 / XFASTINT (limit);
80 do
81 val = (random () & 0x3fffffff) / denominator;
82 while (val >= limit);
83 }
78 } 84 }
79 else 85 else
80 val = random (); 86 val = random ();