[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);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] trunk r116805: * fns.c (Frandom): Fix rare bug where the result isn't random.,
Paul Eggert <=