web-dev-qa-db-ja.com

Rubyで乱数を取得する方法

0nの間の乱数をどうやって生成するのですか?

757

Rand(range) を使用します

From Ruby Random Numbers

6面ダイスのロールをシミュレートするためにランダムな整数が必要な場合は、1 + Rand(6)を使用します。 2 + Rand(6) + Rand(6)を使用して、がらくたのロールをシミュレートできます。

最後に、ランダムなフロートが必要な場合は、Randを引数なしで呼び出します。


Marc-AndréLafortune で言及されている 以下の回答(賛成)Ruby 1.9.2は独自のRandomクラス (Marc-André自身が デバッグを支援 であるため、その機能の 1.9.2ターゲット です)。

たとえば、この 10個の数字を推測する必要があるゲーム では、次のように初期化できます。

10.times.map{ 20 + Random.Rand(11) } 
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]

注意:

Random.new.Rand(20..30)が「ゼロ以上で引数未満のランダムな整数」を返すため、これが20 + Random.Rand(11)に相当するものがRandom.Rand(int)になる理由です。20..30には30が含まれます、11を除く0から11までの乱数を考え出す必要があります。

937
VonC

Rand(42-10) + 10を使用して1042の間の乱数を取得することはできますが(10は包括的で42は包括的です)、Ruby 1.9.3以降でより良い方法があります。

Rand(10...42) # => 13

My backports gemを必要とすることでRubyのすべてのバージョンで利用可能です。

Ruby 1.9.2ではRandomクラスも導入されたため、独自の乱数ジェネレータオブジェクトを作成でき、Nice APIがあります。

r = Random.new
r.Rand(10...42) # => 22
r.bytes(3) # => "rnd"

Randomクラス自体がランダムジェネレータとして機能するので、直接呼び出します。

Random.Rand(10...42) # => same as Rand(10...42)

Random.newに関する注意事項

ほとんどの場合、最も簡単な方法はRandまたはRandom.Randを使用することです。乱数が欲しいときに毎回新しい乱数生成器を作ることは本当に悪い考えです。これを行うと、 ランダムジェネレータ自体のプロパティ と比較して残虐な初期シードアルゴリズムのランダムプロパティが得られます。

Random.newを使うのなら、それをできる限りまれに _と呼ぶべきです、例えばMyApp::Random = Random.newとして一回、それ以外の場所でそれを使うように。

Random.newが役立つケースは次のとおりです。

  • あなたは宝石を書いていて、メインプログラムが依存しているかもしれないRand/Random.Randのシーケンスを妨害したくないでしょう
  • あなたは、別々の再現可能な乱数列を欲しい(スレッドごとに1つ言う)
  • 乱数の再現可能なシーケンスを保存して再開できるようにしたい(Randomオブジェクトが整列化できるので簡単)
582

数値を求めるだけでなく、hexやuuidを求めているのであれば、SecureRandomモジュールが1.9.2以降でActiveSupportからRubyコアへの道を見いだしたことを言及する価値があります。そのため、本格的なフレームワークを必要としません。

require 'securerandom'

p SecureRandom.random_number(100) #=> 15
p SecureRandom.random_number(100) #=> 88

p SecureRandom.random_number #=> 0.596506046187744
p SecureRandom.random_number #=> 0.350621695741409

p SecureRandom.hex #=> "eb693ec8252cd630102fd0d0fb7c3485"

それはここに文書化されています: Ruby 1.9.3 - モジュール:SecureRandom(lib/securerandom.rb)

45

Randメソッドで乱数を生成できます。 Randメソッドに渡される引数はintegerまたはrangeである必要があり、範囲内の対応する乱数を返します。

Rand(9)       # this generates a number between 0 to 8
Rand(0 .. 9)  # this generates a number between 0 to 9
Rand(1 .. 50) # this generates a number between 1 to 50
#Rand(m .. n) # m is the start of the number range, n is the end of number range
35
user1389938

まあ、私はそれを考え出しました。どうやらRandと呼ばれる組み込み(?)関数があります。

Rand(n + 1)

誰かがより詳細な答えで答えるならば、私はそれを正しい答えとしてマークします。

21

これはどうですか?

n = 3
(0..n).to_a.sample
18
Rimian

質問に対する最も簡単な答え:

Rand(0..n)
12
sqrcompass

範囲= 10..50

ランド(範囲)

または

range.to_a.sample

または

range.to_a.shuffle (これにより配列全体がシャッフルされます。最初または最後に乱数を選択するか、この配列から任意の乱数を選択してランダムなものを選択できます)

6
sumit
Rand(6)    #=> gives a random number between 0 and 6 inclusively 
Rand(1..6) #=> gives a random number between 1 and 6 inclusively

RangeオプションはRubyの新しい(1.9+と思う)バージョンでのみ利用可能です。

6
Josh

単にrandom_numberを使うことができます。

Nとして正の整数が与えられた場合、random_numberは整数を返します。0 <= random_number <n。

このように使用してください。

any_number = SecureRandom.random_number(100) 

出力は0から100までの任意の数になります。

5
techdreams

このリンクはこれに関して役に立ちます。

http://Ruby-doc.org/core-1.9.3/Random.html

そして、Rubyの乱数について、以下でさらに明確にします。

0から10までの整数を生成

puts (Rand() * 10).to_i

より読みやすい方法で0から10までの数を生成する

puts Rand(10)

15を含む10から15までの数を生成する

puts Rand(10..15)

非ランダム乱数

プログラムが実行されるたびに同じ数列を生成する

srand(5)

10個の乱数を生成する

puts (0..10).map{Rand(0..10)}
4
Sam

あなたはRand(range)をすることができます

x = Rand(1..5)
4
Snifferdog

Ruby言語では、Rand()としてメソッドがあります。この方法を使用して乱数を生成できます。 Rand()メソッドは整数の引数または範囲のみを持ちます。このメソッドの戻り値の型は整数の乱数です。

 Rand()          # This Will generates a random number between 0.0 to 1.0
 Rand(10)        # This Will generates a number between 0 to 10
 Rand(1 .. 9)    # This Will generates a number between 1 to 10
 Rand(1 ... 10)  # This Will generates a number between 2 to 9

注:Rand()によって生成される数値は、単純なアプリケーションには十分です。

ただし、ワンタイムパスワードの生成、パスワードリセットトークンの作成など、セキュリティ目的で必要な場合は、Ruby標準ライブラリの一部であるSecureRandomのいずれかを使用する必要があります。

require 'securerandom'

SecureRandom.random_number
=> 0.232

SecureRandom.random_number(100)
=> 72

SecureRandom.hex
=> "87694e9e5231aba6ssdfs3de39c58cdfbe307"
3
Amol Mohite

多分それはあなたを助けます。私は自分のアプリでこれを使います

https://github.com/rubyworks/facets
class String

  # Create a random String of given length, using given character set
  #
  # Character set is an Array which can contain Ranges, Arrays, Characters
  #
  # Examples
  #
  #     String.random
  #     => "D9DxFIaqR3dr8Ct1AfmFxHxqGsmA4Oz3"
  #
  #     String.random(10)
  #     => "t8BIna341S"
  #
  #     String.random(10, ['a'..'z'])
  #     => "nstpvixfri"
  #
  #     String.random(10, ['0'..'9'] )
  #     => "0982541042"
  #
  #     String.random(10, ['0'..'9','A'..'F'] )
  #     => "3EBF48AD3D"
  #
  #     BASE64_CHAR_SET =  ["A".."Z", "a".."z", "0".."9", '_', '-']
  #     String.random(10, BASE64_CHAR_SET)
  #     => "xM_1t3qcNn"
  #
  #     SPECIAL_CHARS = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "|", "/", "?", ".", ",", ";", ":", "~", "`", "[", "]", "{", "}", "<", ">"]
  #     BASE91_CHAR_SET =  ["A".."Z", "a".."z", "0".."9", SPECIAL_CHARS]
  #     String.random(10, BASE91_CHAR_SET)
  #      => "S(Z]z,J{v;"
  #
  # CREDIT: Tilo Sloboda
  #
  # SEE: https://Gist.github.com/tilo/3ee8d94871d30416feba
  #
  # TODO: Move to random.rb in standard library?

  def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
    chars = character_set.map{|x| x.is_a?(Range) ? x.to_a : x }.flatten
    Array.new(len){ chars.sample }.join
  end

end

https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string /random.rb

それは私のためにうまくいきます

2
amarradi

これはどう?

num = Random.new
num.Rand(1..n)
2
Juan Dela Cruz

ランダム化のためにarray#shuffleメソッドを試す

array = (1..10).to_a
array.shuffle.first
2
LuckyElf

Rubyで乱数を取得する簡単な方法は、

def random    
  (1..10).to_a.sample.to_s
end
2
ysk

最初に srand() を付けてRNGをシードすることを忘れないでください。

0
Liebach

'Rand'関数を使う

Rand(10)