如何从数组中随机选择?
Posted
技术标签:
【中文标题】如何从数组中随机选择?【英文标题】:How do I pick randomly from an array? 【发布时间】:2011-03-29 18:29:28 【问题描述】:我想知道是否有更清洁的方法可以做到这一点。基本上,我想从可变长度的数组中选择一个随机元素。通常,我会这样做:
myArray = ["stuff", "widget", "ruby", "goodies", "java", "emerald", "etc" ]
item = myArray[rand(myarray.length)]
是否有更易读/更简单的东西来替换第二行?或者这是最好的方法。我想你可以做myArray.shuffle.first
,但我几分钟前才在 SO 上看到#shuffle
,我还没有真正使用它。
【问题讨论】:
下面的答案很好,但是关于洗牌的一般观点。我想对整个数组进行填充会比仅仅获得一个随机数要密集得多,所以这不是一个好的方向。 【参考方案1】:只需使用Array#sample
:
[:foo, :bar].sample # => :foo, or :bar :-)
它在 Ruby 1.9.1+ 中可用。为了也能将它与早期版本的 Ruby 一起使用,您可以require "backports/1.9.1/array/sample"
。
请注意,在 Ruby 1.8.7 中,它以不幸的名称 choice
存在;它在以后的版本中被重命名,所以你不应该使用它。
虽然在这种情况下没有用,sample
接受一个数字参数,以防您需要多个不同的样本。
【讨论】:
我早该知道你会给我一个完美的答案(因为我在这里浏览的大多数 Ruby 问题都有你的输入)。我很高兴您指出了版本控制;我正在使用 1.9.2。 apidock(mladen 的评论)没有样本; ruby-doc 也没有。您认为 Ruby 更新到 1.9 的最佳参考是什么? 附带说明,在我先选择另一个答案后更改“正确答案”是否合适? 谢谢 :-) 是的,我们鼓励这样做(见meta.stackexchange.com/questions/19448/…) 我注意到您的编辑删除了对 1.8.8 的提及。它在 1.8-head 中是否仍然可用,而您只是在编辑问题,因为 1.8.8 不会发生? @Andrew:是的,我编辑了我的答案,因为 1.8.8 不会发生。它应该仍然在 1.8-head 中,但是那个分支已经死了 :-(【参考方案2】:myArray.sample(x)
还可以帮助你从数组中获取x个随机元素。
【讨论】:
值得注意的是 my_array.sample(1) != my_array.sample @Redithion 还值得注意的是,my_array.sample(1) == [sample] 和 my_array.sample == sample 之间的区别明确提供您的意思 太好了,这正是我想要的。【参考方案3】:myArray.sample
将返回 1 个随机值。
myArray.shuffle.first
还会返回 1 个随机值。
【讨论】:
洗牌是多余的。 技术上这种随机方法也是正确的***.com/a/84747/2047418【参考方案4】:数组中随机项的随机数
def random_items(array)
array.sample(1 + rand(array.count))
end
可能的结果示例:
my_array = ["one", "two", "three"]
my_array.sample(1 + rand(my_array.count))
=> ["two", "three"]
=> ["one", "three", "two"]
=> ["two"]
【讨论】:
@fwilson 以任意顺序随机收集对象。也适用于测试不同的组合或生成存根数据 为什么不扩展类数组? [].total_random 会更酷。来吧它的红宝石。它的目标! 这永远不会返回一个空数组。您需要将1 +
放在不同的位置。【参考方案5】:
arr = [1,9,5,2,4,9,5,8,7,9,0,8,2,7,5,8,0,2,9]
arr[rand(arr.count)]
这将从数组中返回一个随机元素。
如果您将使用下面提到的行
arr[1+rand(arr.count)]
那么在某些情况下它会返回 0 或 nil 值。
下面提到的那一行
rand(number)
总是返回从 0 到 number-1 的值。
如果我们使用
1+rand(number)
那么它可能会返回 number 并且 arr[number] 不包含任何元素。
【讨论】:
【参考方案6】:class String
def black
return "\e[30m#self\e[0m"
end
def red
return "\e[31m#self\e[0m"
end
def light_green
return "\e[32m#self\e[0m"
end
def purple
return "\e[35m#self\e[0m"
end
def blue_dark
return "\e[34m#self\e[0m"
end
def blue_light
return "\e[36m#self\e[0m"
end
def white
return "\e[37m#self\e[0m"
end
def randColor
array_color = [
"\e[30m#self\e[0m",
"\e[31m#self\e[0m",
"\e[32m#self\e[0m",
"\e[35m#self\e[0m",
"\e[34m#self\e[0m",
"\e[36m#self\e[0m",
"\e[37m#self\e[0m" ]
return array_color[rand(0..array_color.size)]
end
end
puts "black".black
puts "red".red
puts "light_green".light_green
puts "purple".purple
puts "dark blue".blue_dark
puts "light blue".blue_light
puts "white".white
puts "random color".randColor
【讨论】:
以上是关于如何从数组中随机选择?的主要内容,如果未能解决你的问题,请参考以下文章