# Page:AIM-453.djvu/58

Steele and Sussman

56

The Art of the Interpreter

{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.