The problem with rand()
The old school C way of generating random numbers is to call rand()
. The rand()
function, which is still part of C++, takes no arguments and produces a single, uniformly distributed integer in the [0, RAND_MAX]
range. The internal state can be seeded by calling the library function, srand(seed_value)
.
The classic code to generate a random number in the [0, x)
range hasn't changed since the 1980s, shown here:
#include <stdlib.h> int randint0(int x) { return rand() % x; }
However, this code has several problems. The first and most obvious problem is that it doesn't generate all x
outputs with equal likelihood. Suppose, for the sake of argument, rand()
returns a uniformly distributed value in the [0, 32767]
range, then randint0(10)
will return each value in the [0, 7]
range one-3276th more often than it returns either 8
or 9
.
The second problem is that rand()
accesses global state; the same random number generator is shared by every thread in your...