From 079ee8d08eef7d835c2b2fb1c42b514041f60b41 Mon Sep 17 00:00:00 2001 From: Oliver Payne Date: Wed, 20 Apr 2022 23:00:54 +0100 Subject: [PATCH] Add exercise 3.5 --- 3_5.rkt | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 3_5.rkt diff --git a/3_5.rkt b/3_5.rkt new file mode 100644 index 0000000..442de9b --- /dev/null +++ b/3_5.rkt @@ -0,0 +1,46 @@ +#lang sicp + +;;For Section 3.1.2 -- written as suggested in footnote, +;; though the values of a, b, m may not be very "appropriately chosen" +(define (rand-update x) + (let ((a 27) (b 26) (m 127)) + (modulo (+ (* a x) b) m))) + +(define random-init 7) ;**not in book** +(define rand + (let ((x random-init)) + (lambda () + (set! x (rand-update x)) + x))) + +(define (random-in-range low high) + (let ((range (- high low))) + (+ low (random range)))) + +(define (in-circle-test radius x1 x2 y1 y2) + (lambda () + (let ((x (random-in-range x1 x2)) + (y (random-in-range y1 y2))) + (in-circle? radius x y)))) + +(define (in-circle? radius x y) + (<= (+ (* x x) (* y y)) + (* radius radius))) + +(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)) + +(define (estimate-integral pred x1 x2 y1 y2 trials) + (monte-carlo trials (in-circle-test 1.0 x1 x2 y1 y2))) + +;; Area of circle is pi/r^2. Area of square is 2*2 = 4 +;; So calculated probability is pi/4. +(define (estimate-pi trials) + (* 4.0 (estimate-integral in-circle-test -1.0 1.0 -1.0 1.0 trials)))