問題3.81 – SICP(計算機プログラムの構造と解釈)その171

問題3.81

問題文が解りにくいが、 generate または reset の要求を表す値('generate と 整数 を使う)から成るストリームを引数にとって、それぞれの要求に対応して作られた乱数からなるストリームを作る。

(define (rand-update x)
  (remainder (+ x 1812433253) 4294967296))

(define (rand input-stream random-init)
  (define random-stream
    (if (stream-null? input-stream)
        the-empty-stream
        (let ((request (stream-car input-stream)))
             (cons-stream
               (cond ((eq? request 'generate) (rand-update random-init))
                     ((number? request) (rand-update request))
                     (else (error "Unknown request --- RAND" request)))
               (rand (stream-cdr input-stream) (stream-car random-stream))))))
  random-stream)

(define request-stream
  (cons-stream 100
               (cons-stream 'generate
                            (cons-stream 'generate
                                         (cons-stream 100
                                                      (cons-stream 'generate
                                                                   (cons-stream 'generate
                                                                                the-empty-stream)))))))

(stream-head (rand request-stream 1) 6)
gosh> 1812433353
3624866606
1142332563
1812433353
3624866606
1142332563
done
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»