3.5
(define (random-in-range low high)
(let ((range (- high low)))
(+ low (random range))))
(define (make-circle-predicate r x y)
(define (square z)
(* z z))
(lambda (a b)
(<= (sqrt (+ (square (- a x)) (square (- b y)))) r)))
(define (estimate-integral p x1 y1 x2 y2 tries)
(define (iter remains passes)
(if (= 0 remains)
(/ passes tries)
(if (p (random-in-range x1 x2) (random-in-range y1 y2))
(iter (- remains 1) (+ passes 1))
(iter (- remains 1) passes))))
(iter tries 0))
3.6
(define rand2
(let ((n 0))
(define (do-rand op)
(cond ((eq? op 'generate)
(begin (set! n (+ n 1))
n))
((eq? op 'reset) (lambda (x) (set! n x)))))
do-rand))