たとえば、3〜10の乱数を生成するには、Rand(8) + 3
を使用します。
これを行うより良い方法はありますか(Rand(3, 10)
のようなもの)?
更新: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
は最高値です。
範囲演算子の違いに注意してください。
3..10 # includes 10
3...10 # doesn't include 10
this answer:Ruby 1.9.2にありますが、以前のバージョンにはありません。を参照してください。個人的には、Rand(8)+ 3は問題ないと思いますが、興味がある場合は、リンクに記載されているRandomクラスを確認してください。
def random_int(min, max)
Rand(max - min) + min
end
10および10 ** 24の場合
Rand(10**24-10)+10
そして、これは#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)
を行うことは正しいことです