回答:
更新: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
Ruby 1.8.7以降の標準。
注:1.8.7では#choiceと名付けられ、以降のバージョンでは名前が変更されました。
とにかく、配列を生成するにはリソースが必要であり、すでに作成したソリューションが最高です。
Random.new.rand(a..b)
どこa
があなたの最低値でb
あり、あなたの最高値です。
rand()
だけでが呼び出されKernel#rand
、max
引数のみをサポートすることです。範囲を渡したい場合は、を使用Random#rand
する必要があります。つまり、この方法を実装する必要があります。+1
そしてここに両方#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)
は正しいことです
def my_rand(x, y); rand(y - x) + x; end