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.