Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Random integer within a range?

Reply
Thread Tools

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/.

 
Reply With Quote
 
 
 
 
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/.

 
Reply With Quote
 
 
 
 
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/.

 
Reply With Quote
 
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/.

 
Reply With Quote
 
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/
 
Reply With Quote
 
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/
 
Reply With Quote
 
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/.

 
Reply With Quote
 
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/.

 
Reply With Quote
 
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/.

 
Reply With Quote
 
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]

 
Reply With Quote
 
 
 
Reply

Thread Tools

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 Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Math.random() and Math.round(Math.random()) and Math.floor(Math.random()*2) VK Javascript 15 05-02-2010 03:43 PM
random.random(), random not defined!? globalrev Python 4 04-20-2008 08:12 AM
Random "The IListSource does not contain any datasources" and more (Crashing a live site at random, twice a week or so) Lars-Erik Aabech ASP .Net 8 04-28-2005 07:52 AM
Random not really random... Maziar Aflatoun ASP .Net 4 08-05-2004 01:26 AM
Random NOt random? Darren Clark ASP .Net 3 06-24-2004 05:23 PM



Advertisments