# Question abour rand()

**URL:** <https://www.ruby-forum.com/t/question-abour-rand/180797>\
**Category:** Ruby\
**Created:** [December 29, 2009, 10:52am UTC](https://www.ruby-forum.com/t/question-abour-rand/180797 "2009-12-29T10:52:50Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![atma](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/858c86/32.png) [@atma](https://www.ruby-forum.com/u/atma)\
**Post date:** [December 29, 2009, 10:52am UTC](https://www.ruby-forum.com/t/question-abour-rand/180797/1 "2009-12-29T10:52:50Z")

</div>

Dear Sirs,

I’m looking for a way to create a random sequence of numbers using the  
‘rand’ method. I can think of something like:

* * *

## while pipi == TRUE if x \> 1950 || x \< 2000 return x pipi = FALSE

Since however the book that I’m reading has not introduced while/else/if  
etc. I’m thinking that there must be an easier and probably more  
sensible way to approach this. As far as I’ve read rand(2000) will give  
random numbers from 0-to-2000 no matter what.

NOTE: I don’t want to use another method just to do the job.

thanks in advance & best regards

Panagiotis (atmosx) Atmatzidis

email: removed\_email\_address@domain.invalid  
URL: [http://www.convalesco.org](http://www.convalesco.org)  
GnuPG ID: 0xFC4E8BB4  
gpg --keyserver x-hkp://pgp.mit.edu --recv-keys 0xFC4E8BB4

---

<div class="post-metadata">

**Author:** ![atma](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/858c86/32.png) [@atma](https://www.ruby-forum.com/u/atma)\
**Post date:** [December 29, 2009, 11:28am UTC](https://www.ruby-forum.com/t/question-abour-rand/180797/2 "2009-12-29T11:28:33Z")

</div>

Hello,

> I’m looking for a way to create a random sequence of numbers using the ‘rand’ method. I can think of something like:
> 
> * * *
> 
> while pipi == TRUE  
> if x \> 1950 || x \< 2000

Perhaps you were thinking of “and” rather than “or” because all number  
is either greater than 1950 or smaller than 2000.

> Since however the book that I’m reading has not introduced while/else/if etc. I’m thinking that there must be an easier and probably more sensible way to approach this. As far as I’ve read rand(2000) will give random numbers from 0-to-2000 no matter what.

Does ‘rand(50) + 1950’ do what you want ?

Cheers,

---

<div class="post-metadata">

**Author:** ![atma](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/858c86/32.png) [@atma](https://www.ruby-forum.com/u/atma)\
**Post date:** [December 29, 2009, 4:40pm UTC](https://www.ruby-forum.com/t/question-abour-rand/180797/3 "2009-12-29T16:40:52Z")

</div>

On 2009-12-29, Panagiotis A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> while pipi == TRUE  
> if x \> 1950 || x \< 2000  
> return x  
> pipi = FALSE

Hmm. Looks as though you want the range 1951…1999. Well, that’s easy  
enough:

rand(49) + 1951

(Note that rand(49) returns anything from 0 to 48, inclusive.)

-s

---

<div class="post-metadata">

**Author:** ![atma](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/858c86/32.png) [@atma](https://www.ruby-forum.com/u/atma)\
**Post date:** [December 29, 2009, 6:00pm UTC](https://www.ruby-forum.com/t/question-abour-rand/180797/4 "2009-12-29T18:00:40Z")

</div>

Panagiotis A. wrote:

> Dear Sirs,
> 
> I’m looking for a way to create a random sequence of numbers using the  
> ‘rand’ method. I can think of something like:
> 
> * * *
> 
> ## while pipi == TRUE if x \> 1950 || x \< 2000 return x pipi = FALSE
> 
> Since however the book that I’m reading has not introduced while/else/if  
> etc. I’m thinking that there must be an easier and probably more  
> sensible way to approach this. As far as I’ve read rand(2000) will give  
> random numbers from 0-to-2000 no matter what

Use Seebs’ suggestion.

> NOTE: I don’t want to use another method just to do the job.

Then you are probably being silly. It will make for more readable and  
more reusable code if you encapsulate this in a method. Having lots of  
short methods is generally a _good_ thing.

> thanks in advance & best regards
> 
> Panagiotis (atmosx) Atmatzidis
> 
> email: removed\_email\_address@domain.invalid  
> URL: [http://www.convalesco.org](http://www.convalesco.org)  
> GnuPG ID: 0xFC4E8BB4  
> gpg --keyserver x-hkp://pgp.mit.edu --recv-keys 0xFC4E8BB4

## Best,

Marnen Laibow-Koser  
[http://www.marnen.org](http://www.marnen.org)  
removed\_email\_address@domain.invalid

---

<div class="post-metadata">

**Author:** ![atma](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/858c86/32.png) [@atma](https://www.ruby-forum.com/u/atma)\
**Post date:** [December 29, 2009, 6:56pm UTC](https://www.ruby-forum.com/t/question-abour-rand/180797/5 "2009-12-29T18:56:08Z")

</div>

Hi,

Am Dienstag, 29. Dez 2009, 18:51:53 +0900 schrieb Panagiotis A.:

> NOTE: I don’t want to use another method just to do the job.
> 
> thanks in advance & best regards

The “rand” method has been mentioned. Here are just some  
considerations about the above code.

You don’t need a loop for calculating a random value. (There is a  
random algorithm below.) But when use a loop, then you either say  
“return” or leave it by a condition but not both.

cond = true  
while cond do  
…  
if some\_condition then  
cond = false  
end  
…  
end

_or_

loop do  
…  
break if some\_condition  
…  
end

Note that “break” can even return values:

result = loop do  
break “hi”  
end  
result == “hi”

And here is an example of a very simple random implementation:

class R  
def initialize  
@r = 0  
end  
def nextval  
@r = ((@r \* 0xabcd) + 0x73737) % 0x1\_0000\_0000  
@r \>\> 16  
end  
end  
r = R.new  
new\_random\_value = r.iterate  
random\_value\_below\_fifty = r.iterate % 50

Bertram

---

<div class="post-metadata">

**Author:** ![atma](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/858c86/32.png) [@atma](https://www.ruby-forum.com/u/atma)\
**Post date:** [December 29, 2009, 6:06pm UTC](https://www.ruby-forum.com/t/question-abour-rand/180797/6 "2009-12-29T18:06:57Z")

</div>

On 29.12.2009 18:00, Marnen Laibow-Koser wrote:

> > NOTE: I don’t want to use another method just to do the job.
> 
> Then you are probably being silly. It will make for more readable and  
> more reusable code if you encapsulate this in a method. Having lots of  
> short methods is generally a _good_ thing.

“Walk before you run.”

---

<div class="post-metadata">

**Author:** ![atma](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/858c86/32.png) [@atma](https://www.ruby-forum.com/u/atma)\
**Post date:** [December 29, 2009, 11:00pm UTC](https://www.ruby-forum.com/t/question-abour-rand/180797/7 "2009-12-29T23:00:58Z")

</div>

Panagiotis A. wrote:

> I’m looking for a way to create a random sequence of numbers using the  
> ‘rand’ method.

Others have answered the ‘random number between 1950 and 2000’ bit.

In terms of creating a “sequence” of these values, here are a couple of  
options to consider.

(1) Build an array.

a = []  
10.times { a \<\< rand(50) }

This array (a) is an object which can be returned, passed to other  
functions etc. The above code hard-codes the number of values to build  
(10), but you could choose this dynamically at run-time instead.

(2) Yield the values.

For code which wants to “return” multiple values, you can instead  
“yield” the values to a block which the caller provides. You can yield  
multiple times, thus calling the block multiple times. In other  
programming languages you might call this a “callback function”

def generate\_random(n=10)  
n.times do  
yield rand(50)  
end  
end

generate\_random do |r|  
puts “I got #{r}!”  
end

Note that you can legitimately yield an infinite number of times,  
because the block can abort the sequence when it wants. So in the  
following example, the user of the function decides when they don’t want  
any more random numbers:

def generate\_infinite  
loop do  
yield rand(50)  
end  
end

count = 0  
generate\_infinite do |r|  
puts “I got #{r}!”  
count += 1  
break unless count \< 10  
end

A more advanced way to do this is with an ‘Enumerator’ object, but I’d  
say you should start with the above for now.
