ハッシュからn個のランダムなキーと値のペアを抽出しようとしています。
Hash[original_hash.to_a.sample(n)]
Ruby 2.1の場合、
original_hash.to_a.sample(n).to_h
私はそのような方法を知りません。それでもあなたは次のようなことをすることができます:
h[h.keys.sample]
複数の要素をサンプリングする必要がある場合は、コードをもう少し複雑にする必要があります。
編集:値だけではなくキーと値のペアを取得するには、次のようにします:
keys_sample = h.keys.sample(n)
keys_sample.Zip(keys_sample.map{|k| h[k])
トップランクの回答を読んで、私はそれで決まります:
ハッシュから1つのみ要素をサンプリングする場合、 @ Ivaylo Strandjevのソリューション はハッシュルックアップとArray#sample
:
hsh[hsh.keys.sample]
multipleハッシュ要素をサンプリングするには、 @ sawaの回答 がArray#to_h
を利用します:
hsh.to_a.sample(n).to_h
@ cadlacが言及しているように 、hsh.to_a.sample.to_h
は期待どおりに機能しないことに注意してください。上げる
TypeError: wrong element type String at 0 (expected array)
この場合のArray#sample
は、要素配列を含む配列ではなく、要素配列のみを返すためです。
回避策はn = 1
を引数として提供する彼の解決策です:
hsh.to_a.sample(1).to_h
PS:賛成票を探すのではなく、Rubyを初めて使う人のための説明として追加するだけです。
サンプルに要素が1つしかない場合は、これを使用できます。
sample = h.keys.sample
h.select { |k,v| k == sample }
または、サンプルに複数の要素が含まれている場合は、これを使用します。
n = 2
sample = h.keys.sample(n)
h.select { |k,v| sample.include?(k) }
これを達成する1つの方法:
rank_hash = {"Listen" => 1, "Download" => 60, "Share" => 150, "Purchase" => 700 }
rank_array = rank_hash.to_a
これを呼び出して、k/vペアのランダム配列サンプルを取得します。
rank_array[Rand(0..3)]
または、これは配列の長さをハードコードしないためです:
rank_array[Rand(0..(rank_array.length) -1)]
例:
["Download", 60]