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 |