Velocity Reviews > Ruby > Random integer within a range?

# Random integer within a range?

Reiichi Tyrael
Guest
Posts: n/a

 03-01-2010
I must create a little game; the one who play it must choose 2 numbers,
the beginning and the end of a range, and the program generate a secret
random number within that range, so the player must guess it!
But the problem is...how do I generate a random number?
I though at something like this:

number_to_guess = rand(n1..n2)

but it give me the error message "in `rand': can't convert Range into
Integer (TypeError)"

What can I do? Thanks!
--
Posted via http://www.ruby-forum.com/.

David Springer
Guest
Posts: n/a

 03-01-2010
Reiichi Tyrael,

Is the range inclusive OR exclusive?

Should n1 OR n2 be reurned sometimes or never?

> number_to_guess = rand(n1..n2)

--
Posted via http://www.ruby-forum.com/.

Reiichi Tyrael
Guest
Posts: n/a

 03-01-2010
David Springer wrote:
> Reiichi Tyrael,
>
> Is the range inclusive OR exclusive?
>
> Should n1 OR n2 be reurned sometimes or never?
>
>> number_to_guess = rand(n1..n2)

Inclusive!

--
Posted via http://www.ruby-forum.com/.

David Springer
Guest
Posts: n/a

 03-01-2010
Reiichi Tyrael wrote:

> Inclusive!

Okay, I'll assume that these are two different positive integers.

Try this:

number_to_guess = (n2 > n1) ? n1 + rand((n2-n1+1)) : n2 +
rand((n1-n2+1))
--
Posted via http://www.ruby-forum.com/.

Robert Klemme
Guest
Posts: n/a

 03-01-2010
On 01.03.2010 20:21, Reiichi Tyrael wrote:
> I must create a little game; the one who play it must choose 2 numbers,
> the beginning and the end of a range, and the program generate a secret
> random number within that range, so the player must guess it!
> But the problem is...how do I generate a random number?
> I though at something like this:
>
> number_to_guess = rand(n1..n2)
>
> but it give me the error message "in `rand': can't convert Range into
> Integer (TypeError)"
>
> What can I do? Thanks!

rand only accepts an integer which will make it produce values in the
range 0...n (exclusive). So you can do:

irb(main):001:0> low, high = 12, 56
=> [12, 56]
irb(main):002:0> r = low + rand(high - low)
=> 54

Kind regards

robert

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

Robert Klemme
Guest
Posts: n/a

 03-01-2010
On 01.03.2010 20:40, Reiichi Tyrael wrote:
> David Springer wrote:
>> Reiichi Tyrael,
>>
>> Is the range inclusive OR exclusive?
>>
>> Should n1 OR n2 be reurned sometimes or never?
>>
>>> number_to_guess = rand(n1..n2)

> Inclusive!

Sorry, I answered before seeing this email. In that case it should be

irb(main):003:0> low, high = 12, 34
=> [12, 34]
irb(main):004:0> r = low + rand(high + 1 - low)
=> 22

You can also do something like this:

irb(main):012:0> (low..high).to_a.sample
=> 21
irb(main):013:0> (low..high).to_a.sample
=> 27

Although in that case you should store the array somewhere for
efficiency reasons.

Kind regards

robert

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

Reiichi Tyrael
Guest
Posts: n/a

 03-01-2010
It's work! Thank you David!
But there is no way to do it like in my version "rand(n1..n2)"? It's
more friendly that way XD

--
Posted via http://www.ruby-forum.com/.

Siep Korteling
Guest
Posts: n/a

 03-01-2010
Reiichi Tyrael wrote:
> It's work! Thank you David!
> But there is no way to do it like in my version "rand(n1..n2)"? It's
> more friendly that way XD

#ruby 1.9
puts (10..20).to_a.sample
#ruby 1.8.6
puts (10..20).to_a.sort_by{rand}.pop

hth,

Siep
--
Posted via http://www.ruby-forum.com/.

Brian Candler
Guest
Posts: n/a

 03-01-2010
Reiichi Tyrael wrote:
> It's work! Thank you David!
> But there is no way to do it like in my version "rand(n1..n2)"? It's
> more friendly that way XD

Sure:

def myrand(r=nil)
if r.is_a?(Range)
rand(r.last - r.first + (r.exclude_end? ? 0 : 1)) + r.first
else
rand(r)
end
end

Or if you prefer:

module Kernel
alias rig_rand :rand
def rand(r=nil)
if r.is_a?(Range)
orig_rand(r.last - r.first + (r.exclude_end? ? 0 : 1)) + r.first
else
orig_rand(r)
end
end
end

I suspect it's not implemented in Ruby because it's not obvious what
rand(0.3..5.7) should do.
--
Posted via http://www.ruby-forum.com/.

Run Paint Run Run
Guest
Posts: n/a

 03-03-2010
Under Ruby 1.9:

10.times.map{ Random.new.rand(20..30) } #=> [26, 26, 22, 20, 30,
26, 23, 23, 25, 22]

 Posting Rules You may not post new threads You may not post replies You may not post attachments You may not edit your posts BB code is On Smilies are On [IMG] code is On HTML code is OffTrackbacks are On Pingbacks are On Refbacks are Off Forum Rules

 Similar Threads Thread Thread Starter Forum Replies Last Post VK Javascript 15 05-02-2010 03:43 PM globalrev Python 4 04-20-2008 08:12 AM Lars-Erik Aabech ASP .Net 8 04-28-2005 07:52 AM Maziar Aflatoun ASP .Net 4 08-05-2004 01:26 AM Darren Clark ASP .Net 3 06-24-2004 05:23 PM