Skip to content

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
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information