Exercise 3.6. It is useful to be able to reset a random-number generator to produce a sequence starting from a given value. Design a new rand procedure that is called with an argument that is either the symbol generate or the symbol reset and behaves as follows: (rand ‘generate) produces a new random number; ((rand ‘reset) <new-value>) resets the internal state variable to the designated <new-value>. Thus, by resetting the state, one can generate repeatable sequences. These are very handy to have when testing and debugging programs that use random numbers.
这里需要使用到分配式的程序设计
(define rand
(let ((x random-init))
(lambda (cm)
(cond ((eq? cm 'generate)
(begin
(set! x (rand-update x))
x))
((eq? cm 'reset)
(lambda (new-value)
(begin
(set! x new-value)
x)))
(else (error "command error -- RAND"))))))