web-dev-qa-db-ja.com

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

たとえば、3〜10の乱数を生成するには、Rand(8) + 3を使用します。

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

186
Misha Moroshko

更新: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という名前が付けられ、以降のバージョンでは名前が変更されました。

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

315
Nakilon
Random.new.Rand(a..b) 

ここで、aは最低値で、bは最高値です。

86
user1782571
Rand(3..10)

Kernel#Rand

MaxがRangeの場合、Randはrange.member?(number)== trueの乱数を返します。

12
Dorian

範囲演算子の違いに注意してください。

3..10  # includes 10
3...10 # doesn't include 10
10
Yaniv Preiss

this answer:Ruby 1.9.2にありますが、以前のバージョンにはありません。を参照してください。個人的には、Rand(8)+ 3は問題ないと思いますが、興味がある場合は、リンクに記載されているRandomクラスを確認してください。

3
bnaul
def random_int(min, max)
    Rand(max - min) + min
end
3
Chaseph

10および10 ** 24の場合

Rand(10**24-10)+10
3
xt.and.r

そして、これは#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)を行うことは正しいことです

2
Vadym Tyemirov