Generating a random bit - lack of randomness in C rand()
Solution 1:
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.
Solution 2:
I'd suggest using a better RNG. You're running on Windows so you can use rand_s
: It's a Microsoft extension that uses the Windows cryptographic RNG.
Solution 3:
rand()
is well-known to suck. random()
is a bit better (sometimes), but drand48()
and its family are much better.
In you need better than that, look into the mersene twister or other PRNG libraries. Or check out /dev/random if that can provide enough data for your needs.