Library
Module
Module type
Parameter
Class
Class type
This library provides pseudo-random number generators (PRNGs) comparable to that of the Random module from OCaml's standard library, but with two extensions:
split
operation that returns a new generator that is statistically independent from the current generator. Both generators can be used in parallel, and can be further splitted, without introducing statistical bias. This splitting operation is particularly useful to implement the lazy generation of pseudo-random infinite data structures such as functions or streams.Random.State
standard library module, another, purely functional interface is provided. In the functional interface, the current state of the PRNG appears as parameter but also as result of the number generation functions. This interface can be used directly within a state monad.module type STATE = sig ... end
In this alternate interface, number-generating functions do not update the current state of the generator in-place. Instead, they return the updated generator as a second result. It is the programmer's responsibility to correctly thread the generators through the program, typically by using a state monad.
All operations of the STATE
interface are provided except bytes
(too imperative) and copy
, reseed
and remake
(pointless).
module type PURE = sig ... end
module Splitmix : sig ... end
This is an implementation of the STATE
and PURE
interfaces based on the Splitmix design by Guy L. Steele Jr., Doug Lea, and Christine H. Flood.
For seeding, 64 bits of entropy is recommended. Seeds of 8 characters or less are used as a 64-bit integer. Longer seeds are hashed using Digest.string
before being used.
Reseeding is recommended after 232 numbers have been generated.
module Chacha : sig ... end
This is an implementation of the STATE
and PURE
interfaces based on the Chacha 20 stream cipher by D. J. Bernstein.
For seeding, 128 bits of entropy is recommended. Seeds of up to 32 characters are used as keys to the Chacha 20 cipher. Characters beyond the first 32 are ignored.
Reseeding is recommended after 264 numbers have been generated.
module LXM : sig ... end
This is an implementation of the STATE
and PURE
interfaces based on the LXM design by Guy L. Steele Jr, and Sebastiano Vigna. We use the L64X128 variant from Fig. 1 of their OOPSLA 2021 paper.
For seeding, 128 bits of entropy is recommended. The last 32 bytes of the seed are used to initialize the PRNG state.
This PRNG has a large internal state (192 bits) and a period of 2192 - 264. Therefore, reseeding should not be necessary in practice.