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 State.split
operation for generating new pseudo-random states. While it is easy to simulate
State.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 State.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.
module State : sig ... end
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 : State.t ‑> lo:Base.int32 ‑> hi:Base.int32 ‑> Base.int32
val int63 : State.t ‑> lo:Base.Int63.t ‑> hi:Base.Int63.t ‑> Base.Int63.t
val int64 : State.t ‑> lo:Base.int64 ‑> hi:Base.int64 ‑> Base.int64
val nativeint : State.t ‑> lo:Base.nativeint ‑> hi:Base.nativeint ‑> Base.nativeint
val float : State.t ‑> lo:Base.float ‑> hi:Base.float ‑> Base.float
val unit_float : State.t ‑> Base.float
unit_float state = float state ~lo:0. ~hi:1.
, but slightly more efficient (and
right endpoint is exclusive).