10

いくつかの手順でこれを実行できることはわかっていますが、これを実現できる機能があるかどうか疑問に思っていました。

array#sample にして、取得した要素を削除します。

4

5 に答える 5

14

別の非効率的なものですが、何が起こっているのか非常に明白です:

array.shuffle.pop

次のような、Array 自体のサンプル メソッドの破壊的なバージョンがあればよいでしょう。

class Array
  def sample!
    delete_at rand length
  end
end
于 2013-08-28T05:21:22.847 に答える
2

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" 
于 2012-06-12T01:24:14.607 に答える
1

すでに述べた 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 つの操作のセットですが、少なくとも配列自体から離れる必要はありません。

于 2013-08-08T15:53:02.143 に答える
0

多数のアイテムをサンプリングし、それらを元の配列から削除する必要がある場合:

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]
于 2014-05-15T20:14:18.210 に答える