Friday, May 28, 2010

Ex3.5 of SICP(monte-calo simulation)

Use monte-carlo simulation to estimate integrals of an unit cycle
inside a rectangle area.



(define (random-in-range low high)
  (let ((range (- high low)))
    (+ low (random range))))

(define (estimate-integral trials predicate lf ur)
  (* (* (- (car ur) (car lf)) (- (cadr ur) (cadr lf)))
     (monte-carlo trials cesaro-test predicate lf ur)))

(define (cesaro-test predicate lf ur)
  (let* (
 (x1 (car lf))
 (y1 (cadr lf))
 (x2 (car ur))
 (y2 (cadr ur))
 (x (random-in-range x1 x2))
 (y (random-in-range y1 y2))
 (px (car predicate))
 (py (cadr predicate)))
    (<= (+ (* (- x px) (- x px))
   (* (- y py) (- y py)))
1)))

(define (monte-carlo trials experiment predicate lf ur)
  (define (iter trials-remaining trials-passed)
    (cond ((= trials-remaining 0)
           (/ trials-passed trials))
          ((experiment predicate lf ur)
           (iter (- trials-remaining 1) (+ trials-passed 1)))
          (else
           (iter (- trials-remaining 1) trials-passed))))
  (iter trials 0))
;;;for gauche since there is no built-in random function
(define (random x)
  (modulo (sys-random) x))

Sunday, May 23, 2010

SICP Ex3.2

Nothing special just to make sure to call mf in the block of let.
Otherwise,the value of counter cannot be set correctly
没有什么难度,但是要注意一定要在let的内部调用mf。
否则,counter的值不正确。

難しくないですが、letの内部でmf関数をコールすること。
でもないと、counterの値が正しく保持されてない。


(define (make-monitored f)
  (let ((counter 0))
    (define (mf m)
      (cond ((eq? m 'how-many-calls) counter)
    ((eq? m 'reset-count) (set! counter 0))
    (else (set! counter (+ counter 1)) (f m))))
  mf))