How do I pick randomly from an array?
我想知道有没有一个更清洁的方法来做这件事。基本上,我想从可变长度的数组中选择一个随机元素。通常,我会这样做:
1 2
| myArray = ["stuff","widget","ruby","goodies","java","emerald","etc" ]
item = myArray[rand(myarray.length)] |
是否有更易读/更简单的东西来替换第二行?或者这是最好的方法。我想你可以做myArray.shuffle.first,但我几分钟前才看到#shuffle,所以我还没用过。
- 下面的回答很好,不过是关于洗牌的一个一般要点。我可以想象,在整个数组中进行搜索要比得到一个随机数密集得多,所以这不是一个好的方向。
是的Array#sample使用: </P >
1
| [:foo, :bar].sample # => :foo, or :bar :-) |
它是可用的在ruby 1.9.1 +。。。。。。。TO BE也能使用它与红宝石简慢的版本,你可以require"backports/1.9.1/array/sample"。。。。。。。 </P >
值得注意的是,在它的红宝石1.8.7 exists下设unfortunate name choice;它是renamed在以后的版本,你不必使用T说的。 </P >
尽管从诺特是有用的在这个案例,sampleaccepts a number argument案例中你想要一个数的distinct样品。 </P >
- 我应该知道你会给我一个完美的答案(因为我在这里浏览的大多数Ruby问题都有你的输入)。我很高兴您指出了版本控制;我使用的是1.9.2。apidock(mladen的评论)没有样本;ruby-doc也没有。在您看来,更新到1.9的Ruby的最佳参考是什么?
- 在旁注中,在我第一次选择另一个答案之后,更改"正确答案"是否合适?
- 谢谢:-)是的,我们鼓励您这样做(请参阅meta.stackexchange.com/questions/19448/…)
- 我注意到你的编辑删除了1.8.8的内容。它是否仍然在1.8-head中可用,而您只是在编辑问题,因为1.8.8不会发生?
- @安德鲁:是的,我编辑了我的答案,因为1.8.8不会发生。它应该还在1.8头,但是那根树枝死了:-(
- .sample是一个不明显的方法名。我更喜欢选择。把它改回Ruby开发者!
- 方便的是,您也可以在ActiveRecord::Relation上使用sample;例如,@joe.pencils.sample将从joe的铅笔集合中随机选择一个书写工具(假设这里是普通的Rails工具)。
- @紫色夹克:是的,但这可能不是最好的方法。ActiveRecord::Relation将调用委托给一个数组,因此它将加载所有记录,然后随机选择一个。
- @马克·安德&233;拉福:这是一个很好的观点!!一个更优化的方法可能是将一些内联SQL与以下内容结合使用:stackoverflow.com/questions/580639/…
- 我一直回到这里…???
myArray.sample(x)也可以帮助你得到的X的随机元素从数组的。 </P >
- 值得注意的是,我的_array.sample(1)!=我的数组示例
- @同样值得注意的是:my_array.sample(1)==[sample]和my_array.sample==sample之间的区别明确说明了您的意思
将返回1的随机值。 </P >
威尔也回报1的随机值。 </P >
- 洗牌是多余的。
- 从技术上讲,答案仍然正确:)
- 从技术上讲,这种随机方法也是正确的stackoverflow.com/a/84747/2047418
- 技术上讲,洗牌在性能上是昂贵的。
随机数的随机数组中的项目
1 2 3
| def random_items(array)
array.sample(1 + rand(array.count))
end |
可能的结果:实例研究
1 2 3 4 5 6
| my_array = ["one","two","three"]
my_array.sample(1 + rand(my_array.count))
=> ["two","three"]
=> ["one","three","two"]
=> ["two"] |
- @按任意顺序随机收集对象。也适用于测试不同的组合或生成存根数据
- 为什么不扩展类数组?[答:]来点红宝石吧。它的目的!
- 这将永远不会返回空数组。你需要把1 +放在另一个地方。
1 2
| arr = [1,9,5,2,4,9,5,8,7,9,0,8,2,7,5,8,0,2,9]
arr[rand(arr.count)] |
这将返回一个随机元阵列中。 </P >
如果你会使用下面的这些线 </P >
在一些案件中,那么它将返回0值或零。 </P >
下面的这些线 </P >
总是返回的值从0到1号。 </P >
如果我们使用 </P >
然后,它会返回号码和ARR [数] contains NO元。 </P >