System.Random commits (rand `mod` base) error.
You have probably at some point come across the C code "
rand() % base"'. It is very intuitive, but unfortunately creates non-uniform random numbers, which is easy to see if you imagine
rand() producing numbers in say
[0,15) and base being
In the function
System.Random.randomIvalInteger you can see the same thing happening.
The only way I know how to deal with it and generate uniform integers within a range is to artificially restrict the range of the source of randomness to be a multiple of the desired base. It can be done simply by throwing out some random results.
This strategy appears to be used by GMP's mpz_urandomm function:
urandomm.c has the code.