]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/ex3_82.rkt
Lazy version of evaluator and tests.
[sicp.git] / src / sicp / ex3_82.rkt
1 #lang racket
2
3 (define (random-in-range low high)
4   (let ((range (- high low)))
5     (+ low (* (random) range))))
6
7 (define (point-stream x1 x2 y1 y2)
8   (cons-stream
9    (list (random-in-range x1 x2)
10          (random-in-range y1 y2))
11    (point-stream x1 x2 y1 y2)))
12
13 (define (P x y)
14   (define (inside-circle? radius centre-x centre-y)
15     (<= (+ (square (- x centre-x))
16            (square (- y centre-y)))
17         (square radius)))
18   (inside-circle? 1.0 0 0))
19
20 (define (monte-carlo experiment-stream passed failed)
21   (define (next passed failed)
22     (cons-stream
23      (/ passed (+ passed failed))
24      (monte-carlo
25       (stream-cdr experiment-stream) passed failed)))
26   (if (stream-car experiment-stream)
27       (next (+ passed 1) failed)
28       (next passed (+ failed 1))))
29
30 (define (estimate-integral P x1 x2 y1 y2)
31   (monte-carlo (stream-map (lambda (p)
32                              (apply P p))
33                            (point-stream x1 x2 y1 y2))
34                0
35                0))
36
37 (* (stream-ref (estimate-integral P 1 -1 1 -1) 100000) 4.0)