I understand that rand() function generates the same number(s) each you run it if you don't change the seed number. That's where srand() comes in. Time is always changing so I know that you should pass the time(null) parameter to srand. My question is with the code below from a tutorial site.
int main()
{
int i, n=5;
time_t t;
/* Intializes random number generator */
srand((unsigned) time(&t));
/* Print 5 random numbers from 0 to 50 */
for( i = 0 ; i < n ; i++ ) {
printf("%d\n", rand() % 50);
}
return(0);
}
I see no link from the srand
((unsigned) time(&t));
and rand.
printf("%d\n", rand() % 50);
Where is the connection between rand and srand? What I mean or expect is I assume rand() will get some parameter from srand() so it knows to generate different numbers each time. I assume it would look something like rand(srand(time(null));
It's like initializing a variable without using it to me. srand is being initialized, but I don't see it being used.
Does rand generate different numbers because srand is called first before rand?
The rand() function in C++ is used to generate random numbers; it will generate the same number every time we run the program. In order to seed the rand() function, srand(unsigned int seed) is used. The srand() function sets the initial point for generating the pseudo-random numbers.
The generation of the pseudo-random number depends on the seed. If you don't provide a different value as seed, you'll get the same random number on every invocation(s) of your application. That's why, the srand() is used to randomize the seed itself.
The rand subroutine generates a pseudo-random number using a multiplicative congruential algorithm. The random-number generator has a period of 2**32, and it returns successive pseudo-random numbers in the range from 0 through (2**15) -1. The srand subroutine resets the random-number generator to a new starting point.
What is the default value of seed if function rand() is called before srand()? Explanation: If srand() is not called before the call to the function rand() then the value of seed is taken as srand(1) by default.
The random number seed is a global static variable. rand
and srand
both have access to it.
srand()
sets the seed which is used by rand
to generate "random" numbers (in quotes because they're generally pseudo-random). If you don't call srand
before your first call to rand
, it's as if you had called srand(1)
to set the seed to one.
A lot of code uses the current time as the seed so as to make each program run use a different sequence of random numbers but you can always change that to something like srand(42)
during debugging, for the purposes of repeatability. And the call to time()
doesn't actually need a variable to place the time in, you can just pass NULL:
srand (time (NULL));
The whole thing could be implemented in a single file with something like the following, the example given in the standard (ISO C99 7.20.2.2 The srand function
).
// RAND_MAX assumed to be 32767.
static unsigned long int next = 1;
void srand(unsigned int seed) { next = seed; }
int rand(void) {
next = next * 1103515245 + 12345;
return (unsigned int)(next/65536) % 32768;
}
The fact that next
is a static variable at the top of the file means that it's invisible to everything outside the file but visible to everything inside (sort of a localised global). That's the communication method between srand()
and rand()
.
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