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

Ruby 是否有一个特定的函数来检索然后删除随机数组元素?,ruby,Ruby,我知道我可以通过几个步骤来实现这一点,但我想知道是否有一个功能可以实现这一点 我想排列#sample,然后删除检索到的元素。这样如何: array.delete_at(rand(array.length)) 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"]

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

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

这样如何:

array.delete_at(rand(array.length))

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

这也是一组由两个操作组成的操作,但至少您不必离开阵列本身。

另一个低效的操作,但发生的事情非常明显:

array.shuffle.pop
最好是对数组本身使用破坏性的示例方法,类似于:

class Array
  def sample!
    delete_at rand length
  end
end

如果需要对多个项目进行采样并从原始阵列中删除这些项目,请执行以下操作:

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]

感谢提供额外的示例。这基本上是两个步骤(
rand(array.length)
array.delete_at(idx)
)。OP只要求使用一种方法,但这可能是在Ruby中执行此类操作的最简单方法之一。这种方法可能比其他方法效率低(删除需要搜索),但它的作用一目了然。这是事实,但我认为它比使用
rand
,更具可读性,因为已经有一种方法可以在数组中查找随机元素。此外,我们不必拖拽数组的长度,这是我们真正不需要关心的事情。:-)当数组中存在重复项时,这种方法会遇到问题,因为delete按相等方式删除所有项。例如,在本例中,如果sample得到“a”<代码>[“a”、“a”、“b”]。删除示例==>删除:“a”,剩余:[“b”]底线:类似于第二个示例的内容(尽管使用解释器实现的语言)应该是核心数组实现的一部分。我可能会称之为
delete\u sample或其他什么,因为我发现它的作用更明显一些。:-)它必须是数组。洗牌!。pop如果选择此选项,并且希望从原始数组中删除该项,则最好执行
array.shuffle!。弹出
,否则阵列将保持原样。在没有砰(!)的情况下执行
shuffle
,只会为您提供另一个要从中
pop
的数组。这仅在原始数组充满唯一值时有效,否则您将删除所有“2”