こちらの記事「モンテカルロ法による円周率の近似」を 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 件のコメント:
コメントを投稿