Random number generator and seeding

J

Joe

Hi, I have been working on some code that requires a high use of random
numbers within. Mostly I either have to either:
1) flip a coin i.e. 0 or 1, or
2) generate a double between 0 and 1.

I have utilised the following random number source code
http://www.agner.org/random/

What I have found is that there is a problem with seeding. The code
generates a seed based on time(0). I have found that I need to increment
seed and

A snippet of my code is below. I basically generate a Population object that
contains various individuals. I want to randomly choose two individuals from
this population. I wish I could choose these individuals by the following:

// get two parents
ind1 = pool.RouletteWheel();
ind2 = pool.RouletteWheel();
 
C

Chris Theis

Joe said:
Hi, I have been working on some code that requires a high use of random
numbers within. Mostly I either have to either:
1) flip a coin i.e. 0 or 1, or
2) generate a double between 0 and 1.

I have utilised the following random number source code
http://www.agner.org/random/

What I have found is that there is a problem with seeding. The code
generates a seed based on time(0). I have found that I need to increment
seed and

A snippet of my code is below. I basically generate a Population object that
contains various individuals. I want to randomly choose two individuals from
this population. I wish I could choose these individuals by the following:
[SNIP]

I guess it's necessary to clarify some things about random number
generators. In principle they work the following way that you have to pass a
starting seed which is the starting point of your sequence of (pseudo)random
numbers. Passing the same seed to the RNG will result in the same sequence.
This is useful if you need random numbers but simultaneously have the
requirement of reproducing the behavior of your algorithm.

However, normally the seed is passed only at the construction time and
subsequent calls to the RNG's function which actually returns the numbers,
should modify the internally stored seed of the RNG object. You should be
aware that seeds are not numbers which will continuously increase or
decrease. Furthermore, the seed has a great influence on the quality of the
random sequence but this would lead too far here.

In summary you should pass the seed only once to your random number object
and also this object should be created only once.

int Population :: RouletteWheel ( int seed )
{
TRandomMersenne rg(seed);
return rg.Random();
}

This implementation creates a RNG object whenever RouletteWheel is called. I
don't know about the details of your population class but you could put the
TRandomMersenne object there as a member which is initialized with the seed
in the constructor of "population".

HTH
Chris
 
H

Howard

Joe said:
Hi, I have been working on some code that requires a high use of random
numbers within. Mostly I either have to either:
1) flip a coin i.e. 0 or 1, or
2) generate a double between 0 and 1.

I have utilised the following random number source code
http://www.agner.org/random/

What I have found is that there is a problem with seeding. The code
generates a seed based on time(0). I have found that I need to increment
seed and

A snippet of my code is below. I basically generate a Population object
that contains various individuals. I want to randomly choose two
individuals from this population. I wish I could choose these individuals
by the following:

// get two parents
ind1 = pool.RouletteWheel();
ind2 = pool.RouletteWheel();
.
.
int Population :: RouletteWheel ( )
{
int seed = time(0);
TRandomMersenne rg(seed);
return rg.Random();
}

In the above case all the random functions are contained in the Population
class. But when i do this it passes back two identical individuals. So
nstead I had to implement passing an incremented seed to the RouletteWheel
member function as shown below
I dont like this solution as it enforced defining random functions in the
main.cpp class - which i dont want. Is there any way to implement my
desired approach (the former). I dont like the idea of passing incremented
seeds .. even though it does appear to introduce randomness in my results.

Any ideas greatly appreciated!

Cheers,
Joe

You only want to seed a random-number generator once during a given run of a
program. You then call the RNG multiple times to get "random" values.
Seeding the RNG multiple times destroys the "randomness" of the RNG.

-Howard
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,044
Latest member
RonaldNen

Latest Threads

Top