SICPゼミ第32回
練習問題3.81
(define (rand-stream stream) (define (rand-stream-iter stream mt) (if (stream-null? stream) the-empty-stream (let ((message (stream-car stream))) (if (eq? message 'generate) (cons-stream (mt-random-integer mt 1000) (rand-stream-iter (stream-cdr stream) mt)) (let ((new-mt (make <mersenne-twister> :seed message))) (cons-stream (mt-random-integer new-mt 1000) (rand-stream-iter (stream-cdr stream) new-mt))))))) (rand-stream-iter stream (make <mersenne-twister> :seed (sys-time))))
(define (rand-stream stream) (define (rand-stream-iter stream last) (if (stream-null? stream) the-empty-stream (let ((message (stream-car stream))) (if (eq? message 'generate) (let ((new-num (rand-update last))) (cons-stream new-num (rand-stream-iter (stream-cdr stream) new-num))) (cons-stream message (rand-stream-iter (stream-cdr stream) message)))))) (rand-stream-iter stream (rand)))
by pine
練習問題3.82
racket だと (random) で 0~1 の乱数が出てくるので(0,0), (1,1) の長方形でやりました。
(define (estimate-integral P x1 x2 y1 y2) (define (estimate-integral-iter passed failed) (define (guessed-value passed failed) (let ((rectangle-area (* (- x2 x1) (- y2 y1)))) (* 4 (* rectangle-area (/ (* passed 1.0) (+ passed failed)))))) (define (next passed failed) (cons-stream (guessed-value passed failed) (estimate-integral-iter passed failed))) (let ((x (random)) (y (random))) (if (P x y) (next (+ passed 1) failed) (next passed (+ failed 1))))) (estimate-integral-iter 0 0)) (define (P x y) (< (+ (* (- x 0.5) (- x 0.5)) (* (- y 0.5) (- y 0.5))) 0.25))
実行結果
by tube