aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2014-03-19 14:14:32 -0700
committerPaul Eggert2014-03-19 14:14:32 -0700
commitd16ae6228826c561bdb3701bd65d7517bd9e30d5 (patch)
tree74f1bc879dedc2c73c2780ebb3e2fb41787571ee /src
parent37ca9077224a3c0e1c2051a47c58148d826812e8 (diff)
downloademacs-d16ae6228826c561bdb3701bd65d7517bd9e30d5.tar.gz
emacs-d16ae6228826c561bdb3701bd65d7517bd9e30d5.zip
* fns.c (Frandom): Fix rare bug where the result isn't random.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog2
-rw-r--r--src/fns.c13
2 files changed, 13 insertions, 2 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 06e4c3291b5..f7f4a5f03b2 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,7 @@
12014-03-19 Paul Eggert <eggert@cs.ucla.edu> 12014-03-19 Paul Eggert <eggert@cs.ucla.edu>
2 2
3 * fns.c (Frandom): Fix rare bug where the result isn't random.
4
3 Fix porting inconsistency about rounding to even. 5 Fix porting inconsistency about rounding to even.
4 * floatfns.c (emacs_rint) [!HAVE_RINT]: Round to even. 6 * floatfns.c (emacs_rint) [!HAVE_RINT]: Round to even.
5 This way, the unusual !HAVE_RINT case acts like the usual 7 This way, the unusual !HAVE_RINT case acts like the usual
diff --git a/src/fns.c b/src/fns.c
index 7b3d41d5374..499e4b490a6 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -79,8 +79,17 @@ See Info node `(elisp)Random Numbers' for more details. */)
79 seed_random (SSDATA (limit), SBYTES (limit)); 79 seed_random (SSDATA (limit), SBYTES (limit));
80 80
81 val = get_random (); 81 val = get_random ();
82 if (NATNUMP (limit) && XFASTINT (limit) != 0) 82 if (INTEGERP (limit) && 0 < XINT (limit))
83 val %= XFASTINT (limit); 83 while (true)
84 {
85 /* Return the remainder, except reject the rare case where
86 get_random returns a number so close to INTMASK that the
87 remainder isn't random. */
88 EMACS_INT remainder = val % XINT (limit);
89 if (val - remainder <= INTMASK - XINT (limit) + 1)
90 return make_number (remainder);
91 val = get_random ();
92 }
84 return make_number (val); 93 return make_number (val);
85} 94}
86 95