Generating a random bit – lack of randomness in C rand()

Instead of using rand()%2, try rand()>(RAND_MAX/2). You can only assume rand() 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:

The rand function computes a sequence of pseudo-random integers in the range 0 to
RAND_MAX.

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.

Leave a Comment