diff options
| author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-08-26 14:58:44 +0000 |
|---|---|---|
| committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-08-26 14:58:44 +0000 |
| commit | 590d335720d042fb715d97cb65eed51e14caab64 (patch) | |
| tree | 8d879c8196c39e60f6132c225d5fe963b64fb158 /random.c | |
| parent | 7d76dad94ef046623968b21f1037ff9c7a2f2aee (diff) | |
| download | ruby-590d335720d042fb715d97cb65eed51e14caab64.tar.gz ruby-590d335720d042fb715d97cb65eed51e14caab64.tar.xz ruby-590d335720d042fb715d97cb65eed51e14caab64.zip | |
* random.c (random_rand): fixed for edge cases of ranges.
[ruby-dev:39166]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@24674 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'random.c')
| -rw-r--r-- | random.c | 10 |
1 files changed, 7 insertions, 3 deletions
@@ -760,10 +760,11 @@ make_mask(unsigned long x) static unsigned long limited_rand(struct MT *mt, unsigned long limit) { - unsigned long mask = make_mask(limit); int i; - unsigned long val; + unsigned long val, mask; + if (!limit) return 0; + mask = make_mask(limit); retry: val = 0; for (i = SIZEOF_LONG/SIZEOF_INT32-1; 0 <= i; i--) { @@ -1016,7 +1017,7 @@ random_rand(int argc, VALUE *argv, VALUE obj) v = Qnil; if (FIXNUM_P(vmax)) { fixnum: - if ((max = FIX2LONG(vmax) - excl) > 0) { + if ((max = FIX2LONG(vmax) - excl) >= 0) { unsigned long r = limited_rand(&rnd->mt, (unsigned long)max); v = ULONG2NUM(r); } @@ -1042,6 +1043,9 @@ random_rand(int argc, VALUE *argv, VALUE obj) } v = rb_float_new(r * max); } + else if (max == 0.0 && !excl) { + v = rb_float_new(0.0); + } } } else { |
