Next: random.sfc64, Previous: random.sfc16, Up: Top [Contents]
%--------------------------------------------------%
% vim: ft=mercury ts=4 sts=4 sw=4 et
%--------------------------------------------------%
% Copyright (C) 2019 The Mercury team.
% This file is distributed under the terms specified in COPYING.LIB.
%--------------------------------------------------%
%
% File: random.sfc32.m
% Main author: Mark Brown
%
% 32-bit Small Fast Counting generator, by Chris Doty-Humphrey.
%
% http://pracrand.sourceforge.net/
%
% From the above:
% "[A] good small chaotic RNG driven by a bad smaller linear RNG. The
% combination gives it the strengths of each - good chaotic behavior,
% but enough structure to avoid short cycles."
%
%--------------------------------------------------%
%--------------------------------------------------%
:- module random.sfc32.
:- interface.
%--------------------------------------------------%
% A fast, 32-bit SFC generator with unique state. This may achieve
% better performance on 32-bit architectures, but generally does not
% have the quality of the 64-bit generator or the low heap usage of
% the 16-bit generator.
%
:- type params.
:- type ustate.
:- instance urandom(params, ustate).
:- instance urandom_dup(ustate).
% Initialise a 32-bit SFC generator with the default seed. The
% resulting generator produces the same sequence every time.
%
:- pred init(params::out, ustate::uo) is det.
% Initialise a 32-bit SFC generator with the given seed.
%
:- pred seed(uint32::in, uint32::in, uint32::in, params::out, ustate::uo)
is det.
% Generate a uniformly distributed pseudo-random unsigned integer
% of 8, 16, 32 or 64 bits, respectively.
%
:- pred generate_uint8(params::in, uint8::out,
ustate::di, ustate::uo) is det.
:- pred generate_uint16(params::in, uint16::out,
ustate::di, ustate::uo) is det.
:- pred generate_uint32(params::in, uint32::out,
ustate::di, ustate::uo) is det.
:- pred generate_uint64(params::in, uint64::out,
ustate::di, ustate::uo) is det.
% Duplicate a 32-bit SFC state.
%
:- pred urandom_dup(ustate::di, ustate::uo, ustate::uo) is det.
%--------------------------------------------------%
% Generate a uniformly distributed pseudo-random unsigned integer
% of 8, 16, 32 or 64 bits, respectively.
%
% As above, but does not require the params argument (which is a dummy
% type only needed to satisfy the typeclass interface).
%
:- pred generate_uint8(uint8::out, ustate::di, ustate::uo) is det.
:- pred generate_uint16(uint16::out, ustate::di, ustate::uo) is det.
:- pred generate_uint32(uint32::out, ustate::di, ustate::uo) is det.
:- pred generate_uint64(uint64::out, ustate::di, ustate::uo) is det.
%--------------------------------------------------%
%--------------------------------------------------%
Next: random.sfc64, Previous: random.sfc16, Up: Top [Contents]