I have a for
loop that runs 15 times, with dh.setDoors()
in every iteration.
What setDoors
does is call srand(time(0))
, then whenever a random number is needed it'll use, for example, carSetter = rand()%3+1
. Alternatively, it may use decider = rand()%2+1
.
Now, normally decider
and carSetter
are used in a different ways, but I suspected a problem and made it print out carSetter
and decider
at every iteration. Here's what came out:
Door 1 has car
Decider is 2
Door 1 has car
Decider is 2
Door 1 has car
Decider is 2
Door 1 has car
Decider is 2
Door 1 has car
Decider is 2
etc...
The values '1' and '2' change when I run it multiple times, but are still the same throughout the 15 times.
Since the loop is running 15 different times, shouldn't carSetter
and decider
print out a different random number every iteration?
When I don't have srand(time(0))
, it works as expected, but there's no seed set, so it's the same sequence of "random" numbers each time, so it's probably a problem with the seed?
You need to run
srand
in the beginning of your program, for example in themain
-function.When you run
srand(time(0))
at the top of the function in which you are usingrand()
, you are likely to give it the same seed every time.time(0)
gives the time in seconds, so you would need to avoid callingsetDoors
twice within the same second in order to get different numbers every time. If you do callsetDoors
twice within the same second, the random seed will be the same, and subsequent calls torand()
will generate the same sequence of pseudorandom numbers.When you call
srand(x)
, then the value ofx
determines the sequence of pseudo-random numbers returned in following calls torand()
, depending entirely on the value ofx
.When you're in a loop and call
srand()
at the top:then the same random number sequence is generated depending on the value that
time(0)
returns. Since computers are fast and your loop probably runs in less than a second,time(0)
returns the same value each time through the loop. Sox
andy
will be the same each iteration.Instead, you only usually need to call
srand()
once at the start of your program:In the above case,
x
andy
will have different values each time through the loop.Every time you invoke
srand(time(0))
, you're seeding the pseudo-random number generator, imbuing it with a new pseudo-random sequence of numbers. The sequence is different depending on what the argument tosrand
is, and in this instance you usetime(0)
so, assuming you call your program at most once per second, you'll always get a new sequence. When you callrand()
, you just get the next number in this sequence.However, since you've decided to call
srand
multiple times in your program, and because your program is fast (i.e.time(0)
isn't changing), all you're doing is repeatedly resetting the PRNG to the same sequence. That's why you're always getting the same values - you keep reseeding the PRNG to be the same sequence, and this also moves the cursor to the beginning of the sequence.Seed once. Once.
Like Kerrek said, seeding is done only once, in the beginning of the program. After one srand call rand as many times as you like.