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...