[Ruby] 配列を range で作成して shuffle する
memo.
[markdown]
## range
指定した範囲の数の配列を作成します。
> * [class Range](http://docs.ruby-lang.org/ja/2.1.0/class/Range.html)
“`ruby
[1] pry(main)> a = (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
“`
ねぼけて `[1..10]` とか書いてアレってなりました。
> * [若手エンジニア/初心者のためのRuby 2.1入門(4):RubyのRangeクラスと範囲オブジェクト、範囲演算子、イテレーターの使い方 (1/3) – @IT](http://www.atmarkit.co.jp/ait/articles/1405/27/news032.html)
## shuffle
上記で作成した配列をシャッフルしてみます。
> * [instance method Array#shuffle](http://docs.ruby-lang.org/ja/2.1.0/method/Array/i/shuffle.html)
“`ruby
[2] pry(main)> a.shuffle
=> [2, 7, 5, 4, 3, 9, 10, 8, 1, 6]
[3] pry(main)> a.shuffle
=> [2, 3, 1, 10, 4, 5, 6, 9, 8, 7]
“`
これを省略しないで書くとこうなるよう。
Random メソッドが使われています。
“`ruby
[5] pry(main)> a.shuffle(random: Random.new())
=> [3, 2, 1, 7, 9, 4, 5, 6, 10, 8]
[6] pry(main)> a.shuffle(random: Random.new())
=> [4, 2, 9, 10, 1, 6, 7, 3, 8, 5]
“`
## random
上記の Random メソッドの引数に整数値を取ってみると、なんとシャッフルした結果が同じです。
> * [class Random](http://docs.ruby-lang.org/ja/2.1.0/class/Random.html)
“`ruby
[7] pry(main)> a.shuffle(random: Random.new(123))
=> [5, 1, 8, 6, 9, 4, 2, 7, 10, 3]
[8] pry(main)> a.shuffle(random: Random.new(123))
=> [5, 1, 8, 6, 9, 4, 2, 7, 10, 3]
“`
ruby は、メルセンヌ・ツイスタに基づく疑似乱数生成器で、疑似乱数を発生させているそう。
なぜ疑似なのか。
> * [メルセンヌ・ツイスタ – Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%BB%E3%83%B3%E3%83%8C%E3%83%BB%E3%83%84%E3%82%A4%E3%82%B9%E3%82%BF)
巨大な乱数表を事前に持っておき、そのリストから選んだ乱数列を発生させるという仕組みだそうです(意訳)。
> * [Ruby 1.9と2.0でArray#shuffleの結果を同じにしたかった – くりにっき](http://sue445.hatenablog.com/entry/2013/06/23/222144)
> * [#22 カジュアルに乱数を使う方法とその注意点 | tech.kayac.com – KAYAC engineers’ blog](http://tech.kayac.com/archive/22.html)
`Random.new(123)` で与えた整数値は Seed と呼ばれ、リストのこの部分を使ってねと指定したことになります。
故に同じ種から同じ結果が得られたというわけ。
[/markdown]