random class à la java.util.Random
Perl6
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib/Math
META6.json
README.md

README.md

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