如何从数组中随机选择?

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

【讨论】:

以上是关于如何从数组中随机选择?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Julia 的加权数组中选择一个随机项?

如何从数组中选择随机字符串并将其分配给变量? [复制]

如何使用 JavaScript 从数组中选择随机值? [复制]

如何从数组中删除随机元素。 Python

如何从 C# 中的泛型类型数组中选择一组随机值?

如何从数组中随机选择四个元素而不用Java重复?