[Ruby] 配列を range で作成して shuffle する

memo.

range

指定した範囲の数の配列を作成します。

[1] pry(main)> a = (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

ねぼけて [1..10] とか書いてアレってなりました。

shuffle

上記で作成した配列をシャッフルしてみます。

[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 メソッドが使われています。

[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 メソッドの引数に整数値を取ってみると、なんとシャッフルした結果が同じです。

[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 は、メルセンヌ・ツイスタに基づく疑似乱数生成器で、疑似乱数を発生させているそう。
なぜ疑似なのか。

巨大な乱数表を事前に持っておき、そのリストから選んだ乱数列を発生させるという仕組みだそうです(意訳)。

Random.new(123) で与えた整数値は Seed と呼ばれ、リストのこの部分を使ってねと指定したことになります。
故に同じ種から同じ結果が得られたというわけ。