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 10.
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:
http://gmplib.org/manual/Integer-Random-Numbers.html#Integer-Random-Numbers
The file urandomm.c has the code.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.0.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | libraries/random |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |