[erlang-questions] [ANN] Erlang UUID
Richard O'Keefe
<>
Fri Mar 2 03:59:58 CET 2012
>>> I have not tried to track down the paper connected with the algorithm implemented within the random module (B.A. Wichmann and I.D.Hill, in 'An efficient and portable pseudo-random number generator', Journal of Applied Statistics. AS183. 1982, or Byte March 1987), so I am not sure if they were limited to 32 bit integers, but I assume they were.
In fact they were very explicitly concerned with generating good quality random numbers
on machines with 16-bit integers but able to do
16 * 16 -> 32
32 mod 16 -> 16
using register pairs (as you could on a PDP-11, for example). AS183 basically uses three
independent linear congruential generators with 15 bits of state each, giving the equivalent
of one 45-bit linear congruential generator. At the time, people normally expected to work
mostly with single-precision floats and this was ample to give you a 32-bit float result.
This was really exciting to me in DEC-10 Prolog, where integers were held to just eighteen
bits, although we did have the intermediate 36-bit results we needed to make AS183 work,
and which didn't actually have floating point anyway. Here was something I could use on a
PDP-11, a VAX, or a DEC-10, and get the same answers on each.
As has been explained before in this mailing list, and also in a couple of Prolog mailing
lists, is that AS183 was a fine algorithm in its day, but that day has long passed.
Wichmann & Hill have since published a four-generator algorithm, see
Wichmann and Hill have a new generator with a longer period.
[2] B. A. Wichmann, I. D. Hill,
Generating good pseudo-random numbers,
Computational Statistics & Data Analysis, 51, 1614-1622 (2006).
In fact generating full-precision random doubles is something RNG writers often neglect.
As for generating random integers in the range [0,N) where N is a bignum, I would love
to be pointed to a paper on the subject.
More information about the erlang-questions
mailing list