{Gaussian} Pages 32, 68
A typical example of the use of a pseudo-random number generator is to construct a generator for pseudo-random numbers with a Gaussian distribution by adding up a large number of uniformly distributed pseudo-random numbers. We would like to write it in roughly as in Figure N3.
(DEFINE (GAUSSIAN)
(WEBER 0 43))
(DEFINE (WEBER X N)
(COND ((= N 0) X)
(T (WEBER (+ X (RANDOM)) (- N 1)))))
Figure N3
"Gaussian" Pseudo-Random Number Generator
This code should add up 43 pseudo-random numbers obtained by calling RANDOM
. We cannot write such a RANDOM
without side effects, however. We can arrange to pass the seed around, as in Figure N4.
(DEFINE (GAUSSIAN SEED)
(WEBER 0 43 SEED))
(DEFINE (WEBER X N SEED)
(COND ((= N 0) (CONS X SEED))
(T ((LAMBDA (NEWSEED)
(WEBER (+ X NEWSEED) (- N 1) NEWSEED))
(RANDOM SEED)))))
Figure N4
"Gaussian" Pseudo-Random Number Generator, Passing SEED
This is much more complicated. The user of GAUSSIAN
must maintain the seed. Moreover, GAUSSIAN
and WEBER
each need to return two values; here we cons them together, and the user must take them apart.