sig
  module type STATE =
    sig
      type t
      val seed : string -> PRNG.STATE.t
      val make : int array -> PRNG.STATE.t
      val make_self_init : unit -> PRNG.STATE.t
      val bool : PRNG.STATE.t -> bool
      val bit : PRNG.STATE.t -> bool
      val uniform : PRNG.STATE.t -> float
      val float : PRNG.STATE.t -> float -> float
      val byte : PRNG.STATE.t -> int
      val bits8 : PRNG.STATE.t -> int
      val bits : PRNG.STATE.t -> int
      val bits30 : PRNG.STATE.t -> int
      val int : PRNG.STATE.t -> int -> int
      val bits32 : PRNG.STATE.t -> int32
      val int32 : PRNG.STATE.t -> int32 -> int32
      val bits64 : PRNG.STATE.t -> int64
      val int64 : PRNG.STATE.t -> int64 -> int64
      val nativebits : PRNG.STATE.t -> nativeint
      val nativeint : PRNG.STATE.t -> nativeint -> nativeint
      val char : PRNG.STATE.t -> char
      val bytes : PRNG.STATE.t -> bytes -> int -> int -> unit
      val split : PRNG.STATE.t -> PRNG.STATE.t
      val copy : PRNG.STATE.t -> PRNG.STATE.t
      val reseed : PRNG.STATE.t -> string -> unit
      val remake : PRNG.STATE.t -> int array -> unit
    end
  module type PURE =
    sig
      type t
      val seed : string -> PRNG.PURE.t
      val make : int array -> PRNG.PURE.t
      val make_self_init : unit -> PRNG.PURE.t
      val bool : PRNG.PURE.t -> bool * PRNG.PURE.t
      val bit : PRNG.PURE.t -> bool * PRNG.PURE.t
      val uniform : PRNG.PURE.t -> float * PRNG.PURE.t
      val float : float -> PRNG.PURE.t -> float * PRNG.PURE.t
      val byte : PRNG.PURE.t -> int * PRNG.PURE.t
      val bits8 : PRNG.PURE.t -> int * PRNG.PURE.t
      val int : int -> PRNG.PURE.t -> int * PRNG.PURE.t
      val bits : PRNG.PURE.t -> int * PRNG.PURE.t
      val bits30 : PRNG.PURE.t -> int * PRNG.PURE.t
      val bits32 : PRNG.PURE.t -> int32 * PRNG.PURE.t
      val int32 : int32 -> PRNG.PURE.t -> int32 * PRNG.PURE.t
      val bits64 : PRNG.PURE.t -> int64 * PRNG.PURE.t
      val int64 : int64 -> PRNG.PURE.t -> int64 * PRNG.PURE.t
      val nativebits : PRNG.PURE.t -> nativeint * PRNG.PURE.t
      val nativeint : nativeint -> PRNG.PURE.t -> nativeint * PRNG.PURE.t
      val char : PRNG.PURE.t -> char * PRNG.PURE.t
      val split : PRNG.PURE.t -> PRNG.PURE.t * PRNG.PURE.t
    end
  module Splitmix : sig module State : STATE module Pure : PURE end
  module Chacha : sig module State : STATE module Pure : PURE end
  module LXM : sig module State : STATE module Pure : PURE end
end