Reputation: 171321
To generate a random number between 3 and 10, for example, I use: rand(8) + 3
Is there a nicer way to do this (something like rand(3, 10)
) ?
Upvotes: 213
Views: 138013
Reputation: 239
You can use range operators. Do note the difference between the two forms:
3..10 # includes 10
3...10 # doesn't include 10
Upvotes: 13
Reputation: 8833
And here is a quick benchmark for both #sample
and #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)
So, doing rand(a..b)
is the right thing
Upvotes: 3
Reputation: 35074
UPDATE: Ruby 1.9.3 Kernel#rand
also accepts ranges
rand(a..b)
http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
Converting to array may be too expensive, and it's unnecessary.
(a..b).to_a.sample
Or
[*a..b].sample
Standard in Ruby 1.8.7+.
Note: was named #choice in 1.8.7 and renamed in later versions.
But anyway, generating array need resources, and solution you already wrote is the best, you can do.
Upvotes: 362
Reputation: 23939
rand(3..10)
When max is a Range, rand returns a random number where range.member?(number) == true.
Upvotes: 13
Reputation: 909
Random.new.rand(a..b)
Where a
is your lowest value and b
is your highest value.
Upvotes: 90