問題3.5 – SICP(計算機プログラムの構造と解釈)その107

問題3.5

(use srfi-27) ;; for random-integer

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

(define (monte-carlo trails experiment)
  (define (iter trails-remainding trails-passed)
    (cond ((= trails-remainding 0)
           (/ trails-passed trails))
          ((experiment)
           (iter (- trails-remainding 1) (+ trails-passed 1)))
          (else
            (iter (- trails-remainding 1) trails-passed))))
  (iter trails 0))

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

;; 面積と面積から算出した円周率piを表示する手続き
(define (pi-from-monte-carlo-simulation circle-area radius)
  (display circle-area)
  (newline)
  (/ circle-area radius))

;; 中心(5, 7) 半径3 の円の場合
;テスト手続き
(define (p-test x y)
  (<= (+ (square (- x 5)) (square (- y 7))) (square 3)))

;結果
(pi-from-monte-carlo-simulation (estimate-integral p-test 2 8 4 10 100000.0) (square 3))
gosh> 26.953920000000004
2.99488
(pi-from-monte-carlo-simulation (estimate-integral p-test 2 8 4 10 100000.0) (square 3))
gosh> 27.084960000000002
3.00944
(pi-from-monte-carlo-simulation (estimate-integral p-test 2 8 4 10 100000.0) (square 3))
gosh> 27.01404
3.00156

;; 中心(5, 5) 半径5 の円の場合
;テスト手続き
(define (p-test x y)
  (<= (+ (square (- x 5)) (square (- y 5))) (square 5)))

; 結果
(pi-from-monte-carlo-simulation (estimate-integral p-test 0 10 0 10 100000.0) (square 5))
gosh> 79.061
3.16244
(pi-from-monte-carlo-simulation (estimate-integral p-test 0 10 0 10 100000.0) (square 5))
gosh> 79.187
3.16748
(pi-from-monte-carlo-simulation (estimate-integral p-test 0 10 0 10 100000.0) (square 5))
gosh> 79.06
3.1624
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»