1

我想:

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 >

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

谢谢

4

2 回答 2

2

这是我最初建议的一个更传统的版本,它通过 index 删除元素。这个方法改变了原始数组,但也保留了顺序。

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)

我实际上不会使用第二种解决方案,如果这是我想要的,我会首先手动复制数组 - 在查看它之后,它似乎太“聪明”并且令人费解。

于 2013-05-22T21:47:04.530 回答
0

你可以这样做:

a = ["birds","things","people","people"]
a.delete_at(a.find_index(a.sample))
于 2013-05-22T21:48:18.073 回答