diff options
| author | Paul Eggert | 2014-03-19 14:14:32 -0700 |
|---|---|---|
| committer | Paul Eggert | 2014-03-19 14:14:32 -0700 |
| commit | d16ae6228826c561bdb3701bd65d7517bd9e30d5 (patch) | |
| tree | 74f1bc879dedc2c73c2780ebb3e2fb41787571ee /src | |
| parent | 37ca9077224a3c0e1c2051a47c58148d826812e8 (diff) | |
| download | emacs-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/ChangeLog | 2 | ||||
| -rw-r--r-- | src/fns.c | 13 |
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 @@ | |||
| 1 | 2014-03-19 Paul Eggert <eggert@cs.ucla.edu> | 1 | 2014-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 |
| @@ -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 | ||