pcgen-1.0.0: 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. 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.

The first Word64 is the "state", which changes each step of the generator. The second Word64 is the "inc", which stays fixed from step to step. The inc must always be odd for the gerator to work properly (so there are 2^63 possible inc values), though the smart constructors will ensure this. The state value eventually returns to it's initial position after 2^64 uses, and each inc value is a different sequence of states.

Synopsis

Documentation

data PCGen Source #

The PCGen data type. You generally create values of this type with mkPCGen and use them with stepGen or the next method of the RandomGen instance. Possibly in combination with a State, StateT, MonadRandom, etc.

Note that (at the moment) the Read instance is simply derived by the compiler, so it won't be able to ensure an odd inc value. It's guaranteed that any String you get from the Show instance of this data type (also derived) will be correct as long as the original value was made with mkPCGen, but otherwise you must be careful. This will be fixed later.

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. If the value given isn't odd, then it's bumped to the next higher odd value for the inc. The state of the generator is then advanced once, because otherwise the first result tends to be 0 with human picked seeds. See also mkPCGenDetailed.

mkPCGenDetailed :: Word64 -> Word64 -> PCGen Source #

Creates a PCGen using the specified state and inc values and returns it without an initial generator use. It still bumps the inc value up to the next odd value if an even value is given.

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, and if this is all you're going for then you might want to look at the RandomGen instance and its next method. Other functions in this module let you generate values in batches and so forth, such as for rolling dice.