]> git.rkrishnan.org Git - sicp.git/commitdiff
solution to 3.82
authorRamakrishnan Muthukrishnan <vu3rdd@gmail.com>
Sun, 7 Aug 2011 18:12:36 +0000 (23:42 +0530)
committerRamakrishnan Muthukrishnan <vu3rdd@gmail.com>
Sun, 7 Aug 2011 18:12:36 +0000 (23:42 +0530)
src/sicp/ex3_82.rkt [new file with mode: 0644]
src/sicp/streams.rkt

diff --git a/src/sicp/ex3_82.rkt b/src/sicp/ex3_82.rkt
new file mode 100644 (file)
index 0000000..a8351bf
--- /dev/null
@@ -0,0 +1,37 @@
+#lang racket
+
+(define (random-in-range low high)
+  (let ((range (- high low)))
+    (+ low (* (random) range))))
+
+(define (point-stream x1 x2 y1 y2)
+  (cons-stream
+   (list (random-in-range x1 x2)
+         (random-in-range y1 y2))
+   (point-stream x1 x2 y1 y2)))
+
+(define (P x y)
+  (define (inside-circle? radius centre-x centre-y)
+    (<= (+ (square (- x centre-x))
+           (square (- y centre-y)))
+        (square radius)))
+  (inside-circle? 1.0 0 0))
+
+(define (monte-carlo experiment-stream passed failed)
+  (define (next passed failed)
+    (cons-stream
+     (/ 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 P x1 x2 y1 y2)
+  (monte-carlo (stream-map (lambda (p)
+                             (apply P p))
+                           (point-stream x1 x2 y1 y2))
+               0
+               0))
+
+(* (stream-ref (estimate-integral P 1 -1 1 -1) 100000) 4.0)
index e4252cd713915f5fc7bb893e54d654bd8383a027..b0540aedb1246cec7e517dd7bc2401a477704ccb 100644 (file)
@@ -1,5 +1,7 @@
 #lang planet neil/sicp
 
+(#%require (only racket random))
+
 (define (stream-car s) (car s))
 (define (stream-cdr s) (force (cdr s)))