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`
`val bool : State.t ‑> Base.bool`

Produces a random, fair boolean.

`val int : State.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 : 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).