using rand to generate a random numbers

gcc 4.4.4 c89

I am using the code below. However, I keep getting the same number:

    size_t i = 0;

    for(i = 0; i < 3; i++) {
        /* Initialize random number */
        srand((unsigned int)time(NULL));
        /* Added random number (simulate seconds) */
        add((rand() % 30) + 1);
    }

I would like to get 0 to 30 returned. However, the last time I ran this I got 17 three times.

Many thanks,


You're seeding inside the loop (with the same value because of how quickly the loop will be executed), which causes the random number generated to be the same each time.

You need to move your seed function outside the loop:

/* Initialize random number */
srand((unsigned int)time(NULL));

for(i = 0; i < 3; i++) {
    /* Added random number (simulate seconds) */
    add((rand() % 30) + 1);
}

You need to call srand just once, at the beginning of your program.

srand initializes the pseudo random number generator using time in seconds. If you initialize it with a particular number, you will always get the same sequence of numbers. That's why you usually want to initialize it at the beginning using the time (so that the seed is different each time you run the program) and then use only rand to generate numbers which seem random.

In your case the time does not change from iteration to iteration, as its resolution is just 1 second, so you are always getting the first number of the pseudo-random sequence, which is always the same.


You need to do srand((unsigned int)time(NULL)) only once before the loop.


It is completely possible that the 3 times 17 are still completely random.

There is an about 1 in 10 chance of getting two numbers the same when using a range of 1-30 and three picks. (this is due to the birthday problem )

Now, getting three the same results has still a propability of 1 in 900 using the same range.

you might want to read more background on the analysis page of random.org


Seed to the pseudo Random number generator should be called only once outside the loop. Using time as a seed is good thing. However there is still a possiblity of getting the same random number.