(define (monte-carlo trials experiment)
(define (iter trials-remaining trials-passed)
(cond ((= trials-remaining 0)
(/ trials-passed trials))
((experiment)
(iter (- trials-remaining 1) (+ trials-passed 1)))
(else
(iter (- trials-remaining 1) trials-passed))))
(iter trials 0))
(use srfi-27)
(define (random lim)
(* (random-real) lim))
(define (random-in-range low high)
(+ low (random (- high low))))
(define (estimate-integral p xlow xhigh ylow yhigh trials)
(define (exp) (p (random-in-range xlow xhigh) (random-in-range ylow yhigh)))
(let ((d (monte-carlo trials exp)))
(* (* (- xhigh xlow) (- yhigh ylow)) d)))
(define (estimate-pi trials)
(let ((area (estimate-integral (lambda (x y) (<= (+ (expt (- x 5) 2) (expt (- y 7) 2)) (* 3 3)))
2 8 4 10
trials)))
(/ area (* 3.0 3.0))))