0
との間の乱数を生成するにはどうすればよいn
ですか?
17 に答える
使用するrand(range)
ルビーの乱数から:
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]
ノート:
Marc-André Lafortuneの回答(再び) で (再び) 詳細に説明されているように、使用
Random.new.rand(20..30)
(使用Random.new
) は一般的には良い考えではありません。しかし、 を使用しない場合
Random.new
、クラス メソッドrand
はではmax
なく値のみを取ります。バニスターが(精力的に) コメントで指摘しているように (および のドキュメントに記載されているように)。7 桁の乱数を生成する で示されているように、インスタンス メソッドのみが を受け取ることができます。Range
Random
Range
これが、 「ゼロ以上で引数未満のランダムな整数」を返すため、と同等のRandom.new.rand(20..30)
would be20 + Random.rand(11)
である理由です。30 を含むので、11 を除いた 0 から 11 までの乱数を考え出す必要があります。Random.rand(int)
20..30
との間rand(42-10) + 10
の乱数を取得するために使用できますが(10は包括的で42は排他的)、Ruby 1.9.3以降、次のように呼び出すことができるより良い方法があります。10
42
rand(10...42) # => 13
backports
私のgemを要求することで、Rubyのすべてのバージョンで利用できます。
Ruby 1.9.2でもRandom
クラスが導入されたため、独自の乱数ジェネレーターオブジェクトを作成でき、優れた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
オブジェクトをマーシャリングできるので簡単)
数字だけでなく 16 進数や uuid も探している場合は、SecureRandom
モジュールがActiveSupport
1.9.2+ の 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 オプションは、新しい (1.9 以降と思われる) バージョンの ruby でのみ使用できることに注意してください。
rand(range) を行うことができます
x = rand(1..5)
Rubyで乱数を取得する簡単な方法は、
def random
(1..10).to_a.sample.to_s
end
多分それはあなたを助けます。私は自分のアプリでこれを使用します
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)
最初にsrand()で RNG をシードすることを忘れないでください。
array#shuffle
ランダム化の方法を試す
array = (1..10).to_a
array.shuffle.first