web-dev-qa-db-ja.com

配列からランダムに選ぶ方法は?

もっときれいな方法があるかどうか知りたいのですが。基本的に、可変長の配列からランダムな要素を選びます。通常、私はこのようにします:

myArray = ["stuff", "widget", "Ruby", "goodies", "Java", "emerald", "etc" ]
item = myArray[Rand(myarray.length)]

2行目を置き換えるための、より読みやすい/簡単なものはありますか?それともそれが最善の方法です。 myArray.shuffle.firstを実行できると思いますが、数分前にSOで#shuffleを見ただけなので、実際にはまだ使用していません。

519
Paul Hoffer

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は、いくつかの異なるサンプルが必要な場合に備えて、number引数を受け入れます。

1051

myArray.sample(x)は配列からx個のランダム要素を取得するのにも役立ちます。

78
beesasoh
myArray.sample

ランダムな値を1つ返します。

myArray.shuffle.first

ランダムな値も1つ返します。

11
JJ21

配列からの乱数の乱数

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"]
11
Mike Rapadas
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
0
Charon IV
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]は要素を含みません。

0
Muhammad Aamir