MT19937 is a portable Mersenne Twister random number generator. It
is mainly a modification of CMUCL's random number generator with all
the CMUCL-specific parts taken out.

It is faster than the JMT Mersenne Twister implementation, but
significantly slower than native random number generators provided by
major Common Lisp implementations. For light use this shouldn't be a
problem, since it is still very fast.

It should be very stable, since it's based on stable CMUCL code. It
has been tested on CMUCL, SBCL, LispWorks, Allegro CL, GCL, CLISP, and
Corman Lisp.

What's the point?

Why, you might ask, would you want to use a portable, slower random
number generator? The answer is consistancy. The portable version of
this code was originally created for Maxima, a computer algebra
system. They wanted the results of the random number generator to be
portable across several implementations and platforms, so that if you
used a certain seed on CMUCL the numbers generated would be the same
as you would get with the same seed on GCL or CLISP. This was more
important than achieving the maximum possible speed. You may have
similar problems.


MT19937 is a plug-in replacement for the Common Lisp random-number
generator. The MT19937 package exports all the Common Lisp symbols
related to random number generation, so you just need to load MT19937
and call its functions instead of the built-in ones. For example:

;; Load MT19937
(asdf:oos 'asdf:load-op :mt19937)

;; Make random numbers with your implementation's random
;; number generator.
(random 1234567)
(random 42.56)
(random 3.1415d0)

;; Make random numbers using MT19937
(mt19937:random 1234567)
(mt19937:random 42.56)
(mt19937:random 3.1415d0)

;; MT19937 has its own random state
(eq *random-state*
    mt19937:*random-state*)  => nil


MT19937 is in the public domain.