my attempt to do the exercises in sicp.

Monday, August 17, 2009

sicp exercise 3.6



;; 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.  are very handy to have when testing and debugging programs that use random numbers.


(define save-random-state (copy-random-state))

(define (rand cmd)
  (cond ((eq? cmd 'generate) random)
        ((eq? cmd 'reset) (lambda(x)(set! *random-state* x)))))

(display ((rand 'generate) 10)) (newline)
(display ((rand 'generate) 10)) (newline)
(display ((rand 'generate) 10)) (newline)
(display ((rand 'generate) 10)) (newline)
(display ((rand 'generate) 10)) (newline)
(display ((rand 'generate) 10)) (newline)
((rand 'reset) save-random-state) (newline)
(display ((rand 'generate) 10)) (newline)
(display ((rand 'generate) 10)) (newline)
(display ((rand 'generate) 10)) (newline)
(display ((rand 'generate) 10)) (newline)
(display ((rand 'generate) 10)) (newline)
(display ((rand 'generate) 10)) (newline)



No comments: