Exercise 3.82. Redo exercise 3.5 on Monte Carlo integration in terms of streams. The stream version of estimate-integral will not have an argument telling how many trials to perform. Instead, it will produce a stream of estimates based on successively more trials. ———————————————————————————————————————————————————————————————————————— (define (estimate-integral p x1 x2 y1 y2) (define (test random-x random-y) (p (clamp random-x x1 x2) (clamp random-y y1 y2))) ;; clamp serves an analagous purpose to random-in-range (scale-stream (monte-carlo-xy test) (abs (* (- x1 x2) (- y1 y2))))) (define (repeat x) (cons-stream x (repeat x))) (define (stream-evens s) (cons-stream (stream-ref s 0) (stream-evens (stream-tail s 2)))) (define (stream-odds s) (cons-stream (stream-ref s 1) (stream-odds (stream-tail s 2)))) ;; returns a stream of successes/trials for an experiment of two random variables (define (monte-carlo-xy experiment) (define random-stream (rand (repeat 'generate))) ;; stream-based RNG from previous exercise (define xs (stream-evens random-stream)) (define ys (stream-odds random-stream)) (define experiment-results (stream-map experiment xs ys)) (define successes (partial-sums (stream-map (lambda (x) (if x 1 0)) ;; partial-sums also from a previous exercise experiment-results))) (stream-map / successes integers)) ;; return stream of success ratios ;; after meeting: ;; stream-evens and stream-odds are not necessary: (define (map-successive-pairs f s) (cons-stream (f (stream-car s) (stream-car (stream-cdr s))) (map-successive-pairs f (stream-cdr (stream-cdr s))))) (define (monte-carlo-xy experiment) (define random-stream (rand (repeat 'generate))) (define experiment-results (map-successive-pairs experiment random-stream)) (define successes (partial-sums (stream-map (lambda (x) (if x 1 0)) ;; partial-sums also from a previous exercise experiment-results))) (stream-map / successes integers)) ;; return stream of success ratios