問題3.5

(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))))

;(estimate-pi 10000)
;3.1616
;(estimate-pi 1000000)
;3.141172