summaryrefslogtreecommitdiff
path: root/coding-exercises/3/5.rkt
blob: 438db99914b6a4fa778f826632014fc6a1fc9a18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#lang racket
;; 5
(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 (random-in-range low high)
  (let ((r (- high low)))
    (+ low (* r (random)))))

(define (estimate-integral P x1 x2 y1 y2 n)
  (* (monte-carlo n (lambda () (P (random-in-range x1 x2) (random-in-range y1 y2))))
     (* (- x2 x1)
        (- y2 y1))))

(estimate-integral
  (lambda (x y) (<= (+ (sqr (- x 5)) (sqr (- y 7))) 1))
  4 6
  6 8
  100)

;; 6
(define (make-rand seed)
  (define (rand-update)
    (random))
  (define (rand-reset reset)
    (random-seed reset))
  (define (dispatch m . args)
    (cond ((eq? m 'generate) (rand-update))
          ((eq? m 'reset) (rand-reset (car args)))))
  dispatch)
(define rand (make-rand 43))
(rand 'generate)
(rand 'reset 42)