From: "ko1 (Koichi Sasada)" Date: 2013-02-22T08:40:50+09:00 Subject: [ruby-dev:47062] [ruby-trunk - Bug #7903] Array#sampleの引数に渡した乱数生成オブジェクトが負の数を返した場合のエラーメッセージの修正 Issue #7903 has been updated by ko1 (Koichi Sasada). Category set to core Assignee set to nobu (Nobuyoshi Nakada) Target version set to 2.1.0 ---------------------------------------- Bug #7903: Array#sampleの引数に渡した乱数生成オブジェクトが負の数を返した場合のエラーメッセージの修正 https://bugs.ruby-lang.org/issues/7903#change-36724 Author: sho-h (Sho Hashimoto) Status: Open Priority: Low Assignee: nobu (Nobuyoshi Nakada) Category: core Target version: 2.1.0 ruby -v: ruby 2.0.0dev (2013-02-21 trunk 39359) [x86_64-linux] =begin Array#sample に渡す乱数生成オブジェクトが負の数を返す場合、必ず「random number too big」というメッセージの RangeError が発生するようです。 gen = proc { -1 } class << gen alias rand call end [2,4,6,8,10].sample(random: gen) # => test.rb:5:in `sample': random number too big -1 (RangeError) RAND_UPTO が呼び出している rb_random_ulong_limited の以下の処理がいずれも unsigned long のため、必ず「too big」になるのではないかと思いました。上記の例だと r に -1 を指定、limit に 4 が指定されると想像しています。 unsigned long r = NUM2ULONG(v); if (r > limit) { rb_raise(rb_eRangeError, "random number too big %ld", r); } rb_random_real 側ではチェックされているため、わかってる事なのかもしれませんが、念のためチケットを発行してみました。 パッチも作りましたが、適用される場合も NUM2LONG(v)してる行は修正していただいた方がよさそうです。 =end -- http://bugs.ruby-lang.org/