いくつかの手順でこれを実行できることはわかっていますが、これを実現できる機能があるかどうか疑問に思っていました。
array#sample にして、取得した要素を削除します。
別の非効率的なものですが、何が起こっているのか非常に明白です:
array.shuffle.pop
次のような、Array 自体のサンプル メソッドの破壊的なバージョンがあればよいでしょう。
class Array
def sample!
delete_at rand length
end
end
Linuxios は完璧です。別の例を次に示します。
array = %w[A B C]
item_deleted = array.delete_at(1)
ここにirbがあります:
1.9.2p0 :043 > array = %w[A B C]
=> ["A", "B", "C"]
1.9.2p0 :044 > item_deleted = array.delete_at(1)
=> "B"
1.9.2p0 :045 > array
=> ["A", "C"]
1.9.2p0 :047 > item_deleted
=> "B"
すでに述べた rand(array.length) アプローチの代替案は、これかもしれません
element = array.delete array.sample
サンプル:
>> array = (1..10).to_a
>> element = array.delete array.sample
>> array # => [1, 2, 4, 5, 6, 7, 8, 9, 10]
>> element # => 3
これも 2 つの操作のセットですが、少なくとも配列自体から離れる必要はありません。
多数のアイテムをサンプリングし、それらを元の配列から削除する必要がある場合:
array = (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
grab = array.sample(4)
=> [2, 6, 10, 5]
grab.each{ |a| array.delete a }
=> [2, 6, 10, 5]
array
=> [1, 3, 4, 7, 8, 9]