Add exercise 3.5
This commit is contained in:
parent
cc914f21a4
commit
079ee8d08e
|
@ -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)))
|
Loading…
Reference in New Issue