- MODULO BIAS
- SEE ALSO
- COPYRIGHT AND LICENSE
Math::Random::PCG32 - minimal PCG random number generator
use Math::Random::PCG32; # ideally use better seeds than this (see e.g. what # Math::Random::Secure does) my $rng = Math::Random::PCG32->new( 42, 54 ); $rng->rand; $rng->rand(10); $rng->irand; $rng->irand_in( 1, 100 ); $rng->rand_idx( \@some_array ); $rng->rand_elm( \@some_array );
This module includes a minimal PCG (Permuted Congruential Generator) for random numbers
plus utility routines for PCG (Procedural Content Generation).
This pits the (very bad) core
rand function against the rand methods from Math::Random::ISAAC, Math::Random::MTwist, Math::Random::Xorshift, and this module for
cmpthese( -5, ... via the Benchmark module on my somehow still functional 2009 macbook.
Rate isacc xorsh mtwist pcg rand isacc 214269/s -- -92% -96% -96% -99% xorsh 2661857/s 1142% -- -47% -52% -88% mtwist 5030175/s 2248% 89% -- -9% -78% pcg 5518583/s 2476% 107% 10% -- -75% rand 22447322/s 10376% 743% 346% 307% --
Various methods may croak if invalid input is detected. Use new to obtain an object and then call the others using that.
- new initstate initseq
Makes a new object. No peeking! The two seed values must be 64-bit unsigned integers. These could be read off of
use Fcntl; my $raw; sysopen( my $fh, "/dev/random", O_RDONLY ) or die ...; ... = sysread $fh, $raw, 8; my $seed = unpack "Q", $raw;
or for a game one might use values from Time::HiRes or provided by the user with the caveat that
pcg32_srandom_rmay need to be checked that it is okay for users to provide whatever they want.
- decay odds min max
Increments min while successive random values are less than odds ending should a random value fail or max be reached. odds is treated as a
uint32_tvalue (as are min and max), so 50% odds of decay would be
2147483648. Returns the value min is incremented to.
- dice count sides
Sums the result of rolling the given number of dice.
Returns a random number from an object constructed by new. The return value is a 32-bit unsigned integer.
Used to be called rand in older versions of the module.
Returns a 64-bit unsigned integer, possibly by sticking the result of two calls to the RNG together.
- irand_in min max
Returns a random integer in the range of min to max, inclusive.
- irand_way x1 y1 x2 y2
Returns a new point as a list that will bring the first point (given by x1, y1) towards the second point or
undefif the points are the same.
Overflows are not checked for; do not use points that will result in deltas or magnitudes greater than can be handled without overflow by 32-bit values.
- rand [ factor ]
Returns a floating point value in the range 0.0 <= n < 1.0, or in some other range if a number is given as a factor.
- rand_elm array-reference
Returns a random element from the given array, or
undefif the array is empty (or if that is what the array element contained).
- rand_idx array-reference
Returns a random index from the given array, or
undefif the array is empty.
rand_elm and rand_idx ignore modulo bias so will become increasingly unsound as the length of the array approaches
UINT32_MAX. If modulo bias is a concern this module is not what you need.
Please report any bugs or feature requests to
bug-math-random-pcg32 at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Math-Random-PCG32.
Patches might best be applied towards:
New code, not many features, questionable XS. Probably needs a modern compiler for the
stdint types. Untested on older versions of Perl. Untested (by me) on 32-bit versions of Perl;
use64bitint=define is now required.
Various tradeoffs have been made to favor speed over safety: modulo bias is ignored and some methods have integer overflow issues. Using numbers well below
INT32_MAX should avoid these issues.
Math::Random::Secure for good seed choice.
http://xoshiro.di.unimi.it for a different PRNG and tips on compiler flags for use during benchmarks.
though I must say, those PRNG writers, it feels like they are in a small scale war with each other at times -- random chat comment
thrig - Jeremy Mates (cpan:JMATES)
<jmates at cpan.org>
Perl module copyright (C) 2018 by Jeremy Mates
Code under src/ directory (c) 2014 M.E. O'Neill / pcg-random.org
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.