問題3.6

;ここでは、精度は必要ないので線形合同法をストレートに使う。

(define random-init 8)

(define (rand-update x)
  (remainder (+ (* 3 x) 5) 13))

(define rand
  (let ((x random-init))
    (lambda (op)
      (cond ((eq? op 'generate)
             (begin (set! x (rand-update x))
                    x))
            ((eq? op 'reset)
             (lambda (val) (set! x val) x))
            (else (error "please set generate or reset"))))))