10

我知道我可以通过几个步骤来做到这一点,但想知道是否有一个功能可以实现这一点。

我想数组#sample,然后删除检索到的元素。

4

5 回答 5

26

这个怎么样:

array.delete_at(rand(array.length))
于 2012-06-11T22:57:38.473 回答
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

这也是一组两个操作,但至少您不必离开数组本身。

于 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 回答