Code Review
Compare your solutions
(#%require srfi/41)
(define (random-in-range low high)
(let ((range (- high low)))
(+ low (random range))))
(define (square x) (* x x))
(define (in-circle? x y)
(<= (+ (square x) (square y)) 1.0))
(define (monte-carlo experiment-stream passed failed)
(define (next passed failed)
(stream-cons
(/ passed (+ passed failed))
(monte-carlo
(stream-cdr experiment-stream) passed failed)))
(if (stream-car experiment-stream)
(next (+ passed 1) failed)
(next passed (+ failed 1))))
(define (estimate-integral predicate x1 x2 y1 y2)
(define (experiment)
(let ((x (random-in-range x1 x2))
(y (random-in-range y1 y2)))
(predicate x y)))
(define (gen-exp-stream)
(stream-cons (experiment)
(gen-exp-stream)))
(stream-map (lambda (x) (* 4.0 x)) (monte-carlo (gen-exp-stream) 0 0)))
(define pi-stream (estimate-integral in-circle? -1.0 1.0 -1.0 1.0))
;; > (stream-ref pi-stream 999999)
;; 3.141184