Ticket #5280 (new bug)

Opened 2 years ago

Last modified 19 months ago

System.Random commits (rand `mod` base) error.

Reported by: rrnewton Owned by: rrnewton
Priority: normal Milestone: _|_
Component: libraries/random Version: 7.0.3
Keywords: random mod base Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: Incorrect result at runtime Difficulty:
Test Case: Blocked By:
Blocking: Related Tickets:

Description

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.

Change History

Changed 19 months ago by igloo

  • milestone set to _|_
Note: See TracTickets for help on using tickets.