cl: Random Numbers
8.3 Random Numbers
==================
This package also provides an implementation of the Common Lisp random
number generator. It uses its own additive-congruential algorithm,
which is much more likely to give statistically clean random numbers
than the simple generators supplied by many operating systems.
-- Function: cl-random number &optional state
This function returns a random nonnegative number less than NUMBER,
and of the same type (either integer or floating-point). The STATE
argument should be a ‘random-state’ object that holds the state of
the random number generator. The function modifies this state
object as a side effect. If STATE is omitted, it defaults to the
internal variable ‘cl--random-state’, which contains a
pre-initialized default ‘random-state’ object. (Since any number
of programs in the Emacs process may be accessing
‘cl--random-state’ in interleaved fashion, the sequence generated
from this will be irreproducible for all intents and purposes.)
-- Function: cl-make-random-state &optional state
This function creates or copies a ‘random-state’ object. If STATE
is omitted or ‘nil’, it returns a new copy of ‘cl--random-state’.
This is a copy in the sense that future sequences of calls to
‘(cl-random N)’ and ‘(cl-random N S)’ (where S is the new
random-state object) will return identical sequences of random
numbers.
If STATE is a ‘random-state’ object, this function returns a copy
of that object. If STATE is ‘t’, this function returns a new
‘random-state’ object seeded from the date and time. As an
extension to Common Lisp, STATE may also be an integer in which
case the new object is seeded from that integer; each different
integer seed will result in a completely different sequence of
random numbers.
It is valid to print a ‘random-state’ object to a buffer or file
and later read it back with ‘read’. If a program wishes to use a
sequence of pseudo-random numbers which can be reproduced later for
debugging, it can call ‘(cl-make-random-state t)’ to get a new
sequence, then print this sequence to a file. When the program is
later rerun, it can read the original run’s random-state from the
file.
-- Function: cl-random-state-p object
This predicate returns ‘t’ if OBJECT is a ‘random-state’ object, or
‘nil’ otherwise.