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