どうも、ちょげ(@chogetarou)です。
sampleメソッドでハッシュ(Hash)をランダムに並び替えてシャッフルする方法を紹介します。
方法

sampleメソッドでハッシュ(Hash)をランダムに並び替えてシャッフルする方法は、2つあります。
sortメソッド
ひとつは、sortメソッドを使う方法です。
まず、ハッシュのsortメソッドを呼び出します。
sortメソッドのブロックに「|a, b| rand <=> rand
」を指定します。
そして、sortメソッドからto_hメソッドを呼び出します。
#hash=対象のハッシュ
result = hash.sort {|a, b| rand <=> rand }.to_h
上記のto_hメソッドは、対象のハッシュ(Hash)をランダムにソートした結果を返します。
使用例
nums = {
"one" => 1,
"two" => 2,
"three" => 3,
"four" => 4,
"five" => 5,
}
result = nums.sort {|a, b| rand <=> rand }.to_h
p result
出力:
{"four"=>4, "five"=>5, "three"=>3, "one"=>1, "two"=>2}
sampleメソッド
もうひとつは、sampleメソッドを使う方法です。
まず、Hash[]を記述します。
[]内で、ハッシュからto_aメソッド、to_aメソッドからsampleメソッドを呼び出します。
そして、sampleメソッドの引数にハッシュから呼び出したlengthメソッドの結果を指定します。
#h=対象のハッシュ
result = Hash[h.to_a.sample(h.length)]
上記のHash[]は、対象のハッシュ(Hash)をランダムにソートした結果を生成します。
使用例
nums = {
"one" => 1,
"two" => 2,
"three" => 3,
"four" => 4,
"five" => 5,
}
result = Hash[nums.to_a.sample(nums.length)]
p result
出力:
{"four"=>4, "two"=>2, "three"=>3, "five"=>5, "one"=>1}
まとめ
sampleメソッドでハッシュ(Hash)をランダムに並び替えてシャッフルする方法は、次の2つです。
- sortメソッドを使う方法
result = hash.sort {|a, b| rand <=> rand }.to_h
- detectメソッドを使う方法
result = Hash[h.to_a.sample(h.length)]
コメント