From: Kazuhiro NISHIYAMA Date: 2009-08-26T21:03:11+09:00 Subject: [ruby-dev:39166] Re: Random#rand 西山和広です。 At Tue, 25 Aug 2009 18:23:11 +0900, Nobuyoshi Nakada wrote: > > r = Random.new > r.rand #=> a float in 0.0...1.0 > r.rand(max_num) #=> a number in 0.0...max_num > r.rand(range) #=> a number in range > > 引数が与えられた場合は結果のクラスは引数のクラスに従います。 > Rangeの場合は両端の値の差を使います。 Random#rand(1) と Random#rand(0...1) の挙動が違うのは意図した挙動でしょうか? エラーメッセージが「invalid argument」だけなのもわかりにくいように 思います。 % ruby-trunk -e 'p Random.new.rand(1)' 0 % ruby-trunk -e 'p Random.new.rand(0...1)' -e:1:in `rand': invalid argument (ArgumentError) from -e:1:in `
' % 以下のように変更すると同じ挙動になりました。 diff --git a/random.c b/random.c index 3b5729f..9bd2c48 100644 --- a/random.c +++ b/random.c @@ -1016,7 +1016,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); } -- |ZnZ(ゼット エヌ ゼット) |西山和広(Kazuhiro NISHIYAMA)