emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r116805: * fns.c (Frandom): Fix rare bug where the r


From: Paul Eggert
Subject: [Emacs-diffs] trunk r116805: * fns.c (Frandom): Fix rare bug where the result isn't random.
Date: Wed, 19 Mar 2014 21:14:35 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 116805
revision-id: address@hidden
parent: address@hidden
author: Paul Eggert  <address@hidden>
committer: Paul Eggert <address@hidden>
branch nick: trunk
timestamp: Wed 2014-03-19 14:14:32 -0700
message:
  * fns.c (Frandom): Fix rare bug where the result isn't random.
modified:
  src/ChangeLog                  changelog-20091113204419-o5vbwnq5f7feedwu-1438
  src/fns.c                      fns.c-20091113204419-o5vbwnq5f7feedwu-203
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2014-03-19 21:09:08 +0000
+++ b/src/ChangeLog     2014-03-19 21:14:32 +0000
@@ -1,5 +1,7 @@
 2014-03-19  Paul Eggert  <address@hidden>
 
+       * 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

=== modified file 'src/fns.c'
--- a/src/fns.c 2014-02-10 06:04:39 +0000
+++ b/src/fns.c 2014-03-19 21:14:32 +0000
@@ -79,8 +79,17 @@
     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);
 }
 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]