【问题标题】: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,我还没有真正使用它。

【问题讨论】:

  • 下面的答案很好,但是关于洗牌的一般观点。我想对整个数组进行填充会比仅仅获得一个随机数要密集得多,所以这不是一个好的方向。

标签: ruby arrays random


【解决方案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 个随机值。

【讨论】:

【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 2017-09-16
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      相关资源
      最近更新 更多