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