I don't understand why srand() generates so similar random numbers between runs!
I am trying to run the following code
srand ( time(NULL) );
int x = rand();
cout << x << endl;
However instead of a proper random number I always end up with almost the same number, which is growing slowly as the time goes. So I get numbers like: 11669, 11685, 11701, 11714, 11731.
What am I doing wrong?
I am using Visual Studio 2010 SP1.
OK, is srand() really that simple? I mean how would anyone call it a random function?
srand(1) => rand() = 41
srand(2) => rand() = 45
srand(3) => rand() = 48
srand(4) => rand() = 51
....
First, srand()
isn't a random function; it sets up the starting point
of a pseudo-random sequence. And somewhat surprisingly, your
implementation of rand()
seems to be returning a value based on the
previous state, and not on the newly calculated state, so that the first
value after a call to srand()
depends very much on the value passed to
srand()
. If you were to write:
srand( time( NULL ) );
rand();
std::cout << rand() << std::endl;
, I'm sure you'll see a lot more difference.
FWIW: I tried the following on both Windows and Linux:
int
main()
{
srand( time( NULL ) );
int r1 = rand();
std::cout << r1 << ' ' << rand() << std::endl;
return 0;
}
Invoked 10 times at a one second interval, I got:
16391 14979
16394 25727
16397 3708
16404 25205
16407 3185
16410 13933
16417 2662
16420 13411
16427 2139
with VC++ under Windows—you'll note the very low variance of the
first call to rand()
—and
1256800221 286343522
955907524 101665620
1731118607 991002476
1428701871 807009391
44395298 1688573463
817243457 1506183315
507034261 1310184381
1278902902 54648487
2049484769 942368151
1749966544 1833343137
with g++ under Windows; in this case, even the first value read is relatively random.
If you need a good random generator, you'll probably have to use one from Boost; the standard doesn't say much about what algorithm should be used, and implementations have varied enormously in quality.
Make sure you're doing
srand ( time(NULL) );
while(condition) {
int x = rand();
cout << x << endl;
}
and not
while(condition) {
srand ( time(NULL) );
int x = rand();
cout << x << endl;
}
The first way the seed is changed every iteration. The second way you are performing the random function on a very similar seed each iteration (because time doesn't change much).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With