以下の内容はhttps://spring-mt.hatenablog.com/entry/2017/10/02/112431より取得しました。


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 をベースにした擬似乱数生成を行う。

メルセンヌ・ツイスタ - Wikipedia

cpprefjp.github.io

random.cを追ってみる




以上の内容はhttps://spring-mt.hatenablog.com/entry/2017/10/02/112431より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14