Array#samplesの実装を追う(途中)
candidates = [ 'hoge', 'foo', 'bar', 'Sring_MT' ] puts candidates.sample
のようなスクリプトでなぜか自分がよく当たるような気もしたので、Array#sampleの実装を追ってみた。
instance method Array#sample (Ruby 2.4.0)
source
メソッド定義場所はここ https://github.com/ruby/ruby/blob/trunk/array.c#L6258
sampleの実装はここ https://github.com/ruby/ruby/blob/trunk/array.c#L4802
特に乱数生成器のオブジェクトが指定されていなければ、random.cが使われます。 ruby/random.c at trunk · ruby/ruby · GitHub
sampleは下記マクロを呼び出して、ランダムなインデックスを返す。 https://github.com/ruby/ruby/blob/trunk/array.c#L4699
このマクロから呼び出されるのは、rb_random_ulong_limited
https://github.com/ruby/ruby/blob/trunk/random.c#L1026
このrandom.cは MT19937 をベースにした擬似乱数生成を行う。