2010年10月5日火曜日

モンテカルロ法による円周率の近似(Emacs Lisp)

こちらの記事「モンテカルロ法による円周率の近似」を Elisp で真似てみただけ(Haskellは今のところさっぱりわからない)。

;; 平面内の点の座標(1未満)
(defun x ()
  (mapcar #'(lambda (x) (/ x 10000.0))
          (list (random 10000) (random 10000)) ))
x
;; 点と座標中心との距離
(defun d (x)
  (sqrt (+ (* (elt x 0) (elt x 0)) (* (elt x 1) (elt x 1)))) )
d

;; n個の数列を生成して円内にある割合を計算(数列を全部リストで持つのでだいぶ富豪的)。
;; 整数での除算が丸められるので (* n 1.0) の様にしないといけない。
(defun my-calc-pi (n)
  (* 4 (/ (apply #'+
                 (mapcar #'(lambda (x) (if (< (d x) 1) 1 0))
                         (let ((seq) (i 0))
                           (while (< (length seq) n)
                             (setq seq (cons (x) seq))
                             (incf i) )
                           seq )))
          (* n 1.0) )))
my-calc-pi
;; 10,000個の点を生成した場合
(my-calc-pi 10000)
3.1524

「モンテカルロ法」という言葉を久しぶりに目にして何だか高揚した。学生気分を取り戻した感じ。

0 件のコメント:

コメントを投稿