aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
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