I am using rand() to generate either 0 or 1 (rand() % 2). I am seeding it using the current time (srand(time(NULL))).
After much debugging, I realised that rand() never returns an even (odd) number 16 or more times in a row.
Is this a known issue? Is there a better PRNG that comes with C?
I am running on Windows 7 using Visual Studio 2010.
Instead of using
rand()%2, tryrand()>(RAND_MAX/2). You can only assumerand()to be uniform on the interval[0, RAND_MAX].Edit: This was suggested by Shahbaz in the comments, which I only noticed after I posted this answer.
Edit: ArjunShankar called me out on my previous wording: “rand() is only specified to be uniform on the interval [0, RAND_MAX]”
From the C99 standard:
Technically, uniformity (or equidistributed) is not specified, but is the de-facto standard used for implementations of commonly used PRNG’s (e.g. Mersenne Twister). This is to allow a programmer to easily create a custom PRNG with a non-uniform distribution. Without this property, a programmer is forced to implement a custom PRNG from scratch.