是否有一个特定的函数来检索然后删除随机数组元素?

我知道我可以通过几个步骤完成这项工作,但是想知道是否有能够实现这一目标的function。

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

这个怎么样:

array.delete_at(rand(array.length)) 

另一个低效的,但超级明显的是:

 array.shuffle.pop 

什么是好的将是Array本身的示例方法的破坏性版本,如:

 class Array def sample! delete_at rand length end end 

Linuxios的完美之处。 这是另一个例子:

 array = %w[ABC] item_deleted = array.delete_at(1) 

这是在irb:

 1.9.2p0 :043 > array = %w[ABC] => ["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 

Eksample:

 >> array = (1..10).to_a >> element = array.delete array.sample >> array # => [1, 2, 4, 5, 6, 7, 8, 9, 10] >> element # => 3 

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

如果您需要对多个项目进行采样并从原始数组中删除它们:

 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]