Library
Module
Module type
Parameter
Class
Class type
A splittable pseudo-random number generator (SPRNG) functions like a PRNG in that it can be used as a stream of random values; it can also be "split" to produce a second, independent stream of random values.
This module implements a splittable pseudo-random number generator that sacrifices cryptographic-quality randomness in favor of performance.
The primary difference between Splittable_random
and Random
is the split
operation for generating new pseudo-random states. While it is easy to simulate split
using Random
, the result has undesirable statistical properties; the new state does not behave independently of the original. It is better to switch to Splittable_random
if you need an operation like split
, as this module has been implemented with the statistical properties of splitting in mind. For most other purposes, Random
is likely a better choice, as its implementation passes all Diehard tests, while Splittable_random
fails some Diehard tests.
val create : Base.Random.State.t -> t
Create a new t
seeded from the given random state. This allows nondeterministic initialization, for example in the case that the input state was created using Random.make_self_init
.
Constructors like create
and of_int
should be called once at the start of a randomized computation and the resulting state should be threaded through. Repeatedly creating splittable random states from seeds in the middle of computation can defeat the SPRNG's splittable properties.
val of_int : Base.int -> t
Create a new t
that will return identical results to any other t
created with that integer.
val perturb : t -> Base.int -> Base.unit
perturb t salt
adds the entropy of salt
to t
.
split t
produces a new state that behaves deterministically (i.e. only depending on the state of t
), but pseudo-independently from t
. This operation mutates t
, i.e., t
will return different values than if this hadn't been called.
module State : sig ... end
Legacy aliases for the preceding definitions.
val bool : t -> Base.bool
Produces a random, fair boolean.
val int : t -> lo:Base.int -> hi:Base.int -> Base.int
Produce a random number uniformly distributed in the given inclusive range. (In the case of float
, hi
may or may not be attainable, depending on rounding.)
val int32 : t -> lo:Base.int32 -> hi:Base.int32 -> Base.int32
val int63 : t -> lo:Base.Int63.t -> hi:Base.Int63.t -> Base.Int63.t
val int64 : t -> lo:Base.int64 -> hi:Base.int64 -> Base.int64
val nativeint : t -> lo:Base.nativeint -> hi:Base.nativeint -> Base.nativeint
val float : t -> lo:Base.float -> hi:Base.float -> Base.float
val unit_float : t -> Base.float
unit_float state = float state ~lo:0. ~hi:1.
, but slightly more efficient (and right endpoint is exclusive).
module Log_uniform : sig ... end