0
とn
の間の乱数をどうやって生成するのですか?
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)
を使用する(Random.new
を使用する)は、 Marc-AndréLafortune 、 his answer (もう一度) )。
ただし、Random.new
を使用しない場合、 クラスメソッドRand
はmax
ではなく、Range
の値のみを取ります。 banister (精力的に)コメントで指摘します(そして docs for Random
で文書化されています)。 7桁の乱数を生成する で示されているように、 インスタンスメソッド のみがRange
を取ることができます。
Random.new.Rand(20..30)
が「ゼロ以上で引数未満のランダムな整数」を返すため、これが20 + Random.Rand(11)
に相当するものがRandom.Rand(int)
になる理由です。20..30
には30が含まれます、11を除く0から11までの乱数を考え出す必要があります。
Rand(42-10) + 10
を使用して10
と42
の間の乱数を取得することはできますが(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
のシーケンスを妨害したくないでしょうRandom
オブジェクトが整列化できるので簡単)数値を求めるだけでなく、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)
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
まあ、私はそれを考え出しました。どうやらRandと呼ばれる組み込み(?)関数があります。
Rand(n + 1)
誰かがより詳細な答えで答えるならば、私はそれを正しい答えとしてマークします。
これはどうですか?
n = 3
(0..n).to_a.sample
質問に対する最も簡単な答え:
Rand(0..n)
範囲= 10..50
ランド(範囲)
または
range.to_a.sample
または
range.to_a.shuffle (これにより配列全体がシャッフルされます。最初または最後に乱数を選択するか、この配列から任意の乱数を選択してランダムなものを選択できます)
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+と思う)バージョンでのみ利用可能です。
単にrandom_number
を使うことができます。
Nとして正の整数が与えられた場合、random_number
は整数を返します。0 <= random_number
<n。
このように使用してください。
any_number = SecureRandom.random_number(100)
出力は0から100までの任意の数になります。
このリンクはこれに関して役に立ちます。
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)}
あなたはRand(range)をすることができます
x = Rand(1..5)
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"
多分それはあなたを助けます。私は自分のアプリでこれを使います
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
それは私のためにうまくいきます
これはどう?
num = Random.new
num.Rand(1..n)
ランダム化のためにarray#shuffle
メソッドを試す
array = (1..10).to_a
array.shuffle.first
Rubyで乱数を取得する簡単な方法は、
def random
(1..10).to_a.sample.to_s
end
最初に srand() を付けてRNGをシードすることを忘れないでください。
'Rand'関数を使うRand(10)