乐正

Actions speak louder than words.

Sicp-ex3-6

问题

有时也需要能重置随机数生成器,以便从某个给定值开始生成的随机数序列。请重新设计一个rand过程,使得我们可以用符号generate或者符号reset作为参数去调用它。其行为是:(rand 'generate)将产生出一个新的随机数,((rand 'reset) <new-value>)将内部状态变量重新设置为指定的值。通过这样重置状态,我们就可以重复生成同样的序列。在使用随机数测试程序,排除其中错误时,这种功能非常有用。

解答

练习3.6 (ex3-6.scm) download
1
2
3
4
5
6
7
8
9
10
11
12
13
(define (rand m)
  (let ((x random-init))
    (cond ((eq? m 'generate)
           (lambda ()
             (seq! x (rand-update x))
             x))
          ((eq? m 'reset)
           (lambda (n)
             (seq! x (rand-update n))
             x))
          (else
           (lambda ()
             "Unrecognize message")))))

draft

« sicp-ex3-5 sicp-ex3-7 »

Comments