]> git.eshelyaron.com Git - emacs.git/commitdiff
* fns.c (Frandom): Fix rare bug where the result isn't random.
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 19 Mar 2014 21:14:32 +0000 (14:14 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 19 Mar 2014 21:14:32 +0000 (14:14 -0700)
src/ChangeLog
src/fns.c

index 06e4c3291b5bd8f3e4d2ffbefb90c0ab73123393..f7f4a5f03b267a34d4c5d7e89a01b2e19c21bb06 100644 (file)
@@ -1,5 +1,7 @@
 2014-03-19  Paul Eggert  <eggert@cs.ucla.edu>
 
+       * fns.c (Frandom): Fix rare bug where the result isn't random.
+
        Fix porting inconsistency about rounding to even.
        * floatfns.c (emacs_rint) [!HAVE_RINT]: Round to even.
        This way, the unusual !HAVE_RINT case acts like the usual
index 7b3d41d5374fb82d194d9dbbb30bddf3e6d4382c..499e4b490a6f508221d01d15918655d2b5e4510a 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -79,8 +79,17 @@ See Info node `(elisp)Random Numbers' for more details.  */)
     seed_random (SSDATA (limit), SBYTES (limit));
 
   val = get_random ();
-  if (NATNUMP (limit) && XFASTINT (limit) != 0)
-    val %= XFASTINT (limit);
+  if (INTEGERP (limit) && 0 < XINT (limit))
+    while (true)
+      {
+       /* Return the remainder, except reject the rare case where
+          get_random returns a number so close to INTMASK that the
+          remainder isn't random.  */
+       EMACS_INT remainder = val % XINT (limit);
+       if (val - remainder <= INTMASK - XINT (limit) + 1)
+         return make_number (remainder);
+       val = get_random ();
+      }
   return make_number (val);
 }
 \f