## Math::Random Random numbers à la `java.util.Random`. ### Background I was bothered by Perl 6's primitive random number handling (only `rand` and `srand`, with no mechanism to have multiple generators in parallel), so, instead of bugging some random people about it, I decided to write a module! ### Synopsis use Math::Random::JavaStyle; # uses same mechanics as # java.util.Random my $j = Math::Random::JavaStyle.new; $j.setSeed(9001); say $j.nextInt; say $j.nextLong; say $j.nextDouble; say $j.nextInt(100); say $j.nextLong(100_000_000_000); say $j.nextDouble(100); say $j.nxt(256); # generate a random 256-bit integer say $j.nextGaussian; use Math::Random::MT; my $m64 = Math::Random::MT.mt19937_64; # ... ### Usage The `Math::Random` role requires two methods to be implemented: method setSeed(Int $seed) { ... } method nxt(Int $bits) returns Int { ... } Unlike in Java's equivalent, `nxt` is required to accept as large of an input as possible. #### setSeed(Int $seed) Sets the random seed. #### nextInt Returns a random unsigned 32-bit integer. #### nextInt(Int $max) Returns a random nonnegative integer less than `$max`. The upper bound must not exceed `2**32`. #### nextLong Returns a random unsigned 64-bit integer. #### nextLong(Int $max) Returns a random nonnegative integer less than `$max`. The upper bound must not exceed `2**64`. #### nextBoolean Returns `True` or `False`. #### nextDouble Returns a random `Num` in the range [0.0, 1.0). #### nextDouble(Num $max) Returns a random `Num` in the range [0.0, `$max`). #### nextGaussian Returns a random value according to the normal distribution. #### nxt(Int $bits) Returns a random integer with `$bits` bits. ### Acknowledgements Oracle's documentation on `java.util.Random`, as well as Wikipedia's article on the Mersenne Twister generator. ### Todo * Provide constructors that also set the seed. * Ensure thread safety, or create a thread-safe wrapper * Provide higher-level methods * Tests? They won't be easy to pull off, so if anyone wants to PR...