Calling srand() twice in the same program [closed]

2019-05-14 18:11发布

问题:

why is it when i call srand() at 2 very different points it cause numbers to not be random? Once i remove one of them it goes back to normal.

回答1:

It depends on how you call it. The purpose of srand() is to seed the pseudo-random number generator used by rand(). So when you call srand(i), it will initialise rand() to a fixed sequence which depends on i. So when you re-seed with the same seed, you start getting the same sequence.

The most common use case is to seed the generator just once, and with a suitable "random" value (such as the idiomatic time(NULL)). This guarantees makes it likely that you'll get different sequences of pseudo-random numbers in different program executions.

However, occasionally you might want to make the pseudo-random sequence "replayable." Imagine you're testing several sorting algorithms on random data. To get fair comparisons, you should test each algorithm on the exact same data - so you'll re-seed the generator with the same seed before each run.

In other words: if you want the numbers simply pseudo-random, seed once, and with a value as random as possible. If you want some control & replayability, seed as necessary.



回答2:

srand (seed);

Two different initializations with the same seed will generate the same succession of results in subsequent calls to rand.

If seed is set to 1, the generator is reinitialized to its initial value and produces the same values as before any call to rand or srand.

Each time rand() is seeded with srand(), it must produce the same sequence of values.

http://www.cplusplus.com/reference/cstdlib/srand/

http://en.cppreference.com/w/cpp/numeric/random/srand



回答3:

Are you initializing the srand? You have to initialize it in the beginning of you function/code like this:

srand(time(NULL));

It should work :)



回答4:

You may read about pseudo random numbers generators, standard library srand-rand functions are implementation of one of them. The core idea is that pseudo random generator is initialized with the special number - seed. srand() is used to set seed. For every seed pseudo random generator generate exactly the same sequence of numbers ever. By using different seeds you'll get different sequences of numbers. So if you want to get different random numbers everytime you start you program, you need everytime to set new seed. The one of simpliest way to do this is to use time for seed.

#include <time.h>

srand((unsigned int)time(0));