Ruby 有没有一种方法可以从数组中获取一个随机元素,并将其仅删除一个元素

Ruby 有没有一种方法可以从数组中获取一个随机元素,并将其仅删除一个元素,ruby,Ruby,我想: 但看起来样本并不支持这一点。我在sample的论点中遗漏了什么?我知道我可以用返回的内容删除,但这将删除所有具有该值的成员,而不仅仅是单个实例 thx这里是我最初建议的一个更传统的版本。此方法变异原始数组,但也保留顺序 1.9.3p392 :015 > a=["birds","things","people","people"] => ["birds", "things", "people","people"] 1.9.3p392 :016 > a.sample

我想:

但看起来样本并不支持这一点。我在sample的论点中遗漏了什么?我知道我可以用返回的内容删除,但这将删除所有具有该值的成员,而不仅仅是单个实例


thx

这里是我最初建议的一个更传统的版本。此方法变异原始数组,但也保留顺序

1.9.3p392 :015 > a=["birds","things","people","people"]
 => ["birds", "things", "people","people"] 
1.9.3p392 :016 > a.sample
 => "people" 
1.9.3p392 :017 > a
 => ["birds", "things","people"] 
1.9.3p392 :018 >
这是另一个没有副作用的解决方案(它利用了一个新的解决方案)。这种方法会改变其余元素的顺序,对于大型阵列可能“效率较低”

a = ["birds","things","people","people"]
i = rand(a.size)
# delete_at returns the element removed, or nil
elm = a.delete_at(i)
实际上,我不会使用第二种解决方案,如果这是我想要的,我会首先手动复制阵列-在查看后,它看起来太“聪明”和复杂。

您可以这样做:

a = ["birds","things","people","people"]
elm, *rest = a.sample(a.size)

可以通过样本作为参数来完成。似乎它应该-比任何东西都更奇怪
Array#sample
没有提供一种方法来实现这一点。它可以在一行中完成,但不是很漂亮
sample=a.delete_at(rand(a.length))#sample可能是birds…
thx,你能给我一句话,说明样本大小表单示例中发生了什么吗?@timpone在第一个表单中,对整个数组进行采样(这意味着它是随机排序的),然后将第一个元素拉到
elm
中,剩下的一个元素(仍然是随机排列的)元素被放入分配给
rest
的数组中。这是一个“splat分配”。下面是一个简单的版本:
elm,*arr=[1,2,3]
;elm->1,arr->[2,3]如果是一个外循环,它看起来像这样工作:
elm,*a=a.sample(a.size)
thx
a = ["birds","things","people","people"]
a.delete_at(a.find_index(a.sample))