Rubyでaとbの間に乱数を生成する方法は?


189

たとえば、3〜10の乱数を生成するには、次のようにします。 rand(8) + 3

これを行うより良い方法はありrand(3, 10)ますか?


4
def my_rand(x, y); rand(y - x) + x; end
Theo

@Theo、y - x + 1方法によって、。
Nakilon、

1
10と10 ** 24で正しい答えを試してください。制限:0は非常に長い間待機するためです:)
xt.and.r

5
これは機能しますrand(3..10)
。– eikes

回答:


323

更新:Ruby 1.9.3 Kernel#randも範囲を受け入れます

rand(a..b)

http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html

配列への変換は高すぎる可能性があり、不要です。


(a..b).to_a.sample

または

[*a..b].sample

Array#sample

Ruby 1.8.7以降の標準。
注:1.8.7では#choiceと名付けられ、以降のバージョンでは名前が変更されました。

とにかく、配列を生成するにはリソースが必要であり、すでに作成したソリューションが最高です。


ありがとう!私は古い方法と良い方法を使い続けると思います:)
Misha Moroshko

32
これは本当に悪い考えです。特に、aとbのサイズが不明な場合はなおさらです。(100000000000000000..100000000000000).to_a.sampleを試して、意味を確認してください:)
pixelearth

4
@pixelearth、質問と一致するより良いアイデアがある場合は、投稿してください。
Nakilon、2011

rand(a..b)動作しません、分割されます:TypeError: can't convert Range into IntegerRuby 2.0
fguillen

2
@fguillen 1.9.3では機能しますが、なぜ機能しないのかわかりません。
Michael Dorst

87
Random.new.rand(a..b) 

どこaがあなたの最低値でbあり、あなたの最高値です。


4
注意すべき重要な違いは、を呼び出すrand()だけでが呼び出されKernel#randmax引数のみをサポートすることです。範囲を渡したい場合は、を使用Random#randする必要があります。つまり、この方法を実装する必要があります。+1
グランピット2013年

2
上記が1.9.2に適用されることを追加する必要があります
グランピット2013年

aとbが含まれていますか?
Abhradip



3

この答えを見てください:Ruby 1.9.2にはありますが、以前のバージョンにはありません。個人的にはrand(8)+ 3で十分だと思いますが、興味がある場合は、リンクに記載されているRandomクラスを確認してください。




2

そしてここに両方#sampleとの簡単なベンチマークがあり#randます:

irb(main):014:0* Benchmark.bm do |x|
irb(main):015:1*   x.report('sample') { 1_000_000.times { (1..100).to_a.sample } }
irb(main):016:1>   x.report('rand') { 1_000_000.times { rand(1..100) } }
irb(main):017:1> end
       user     system      total        real
sample  3.870000   0.020000   3.890000 (  3.888147)
rand  0.150000   0.000000   0.150000 (  0.153557)

そうすることrand(a..b)は正しいことです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.