pcgen-2.0.1: A fast, pseudorandom number generator.

Safe HaskellSafe
LanguageHaskell2010

Data.PCGen

Description

This module contains a permuted linear congruential pseudorandom number generator, as described by M.E. O'Neill (pcg-random.org). This version holds two Word64 values and outputs a Word32 of randomness each time you use it. Compared to the StdGen type from System.Random, it's around a 2.5x to 3x speedup on a 64-bit system. It runs somewhat slower than StdGen on a 32-bit system (the Word64 values must be emulated after all), but there aren't too many of those in play these days anyway. Raspberry Pi is the only common thing I can think of, which isn't the best for Haskell in the first place. If you somehow are using 32-bit all the time I guess this module isn't for you.

The first Word64 is the state, which changes with each step of the generator. The second Word64 is the inc, which stays fixed from step to step and controls what stream of numbers is generated. The inc is always bitwise OR'd with 1 during computations, so there are only 2^63 distinct number streams (eg: inc 2 and 3 are the same number stream). The state value eventually returns to it's initial value after 2^64 uses and the whole sequence loops around.

Synopsis

Documentation

data PCGen Source #

The PCGen data type. You can use the constructor yourself with two Word64 values, but with human picked seeds the first result will generally be 0. To avoid that you can use the mkPCGen helper.

Constructors

PCGen !Word64 !Word64 

mkPCGen :: Integral i => i -> PCGen Source #

Creates a new PCGen value by using the Integral given as both the state and inc values for the generator. The state of the generator is then advanced once, because otherwise the first result tends to be 0 with human picked seeds.

stepGen :: PCGen -> (Word32, PCGen) Source #

Advances the given generator one step, giving back a Word32 of output and the resultant generator as well. This is the most basic way to advance the generator. You probably want to use the RandomGen instance and the next method, along with something like MonadRandom