diff --git a/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp b/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp new file mode 100644 index 000000000..f1b90052e --- /dev/null +++ b/contents/monte_carlo_integration/code/lisp/monte-carlo.lisp @@ -0,0 +1,18 @@ +;;;; Monte carlo integration to approximate pi + +(defun in-circle-p (x y) + "Checks if a point is in a unit circle" + (< (+ (* x x) (* y y)) 1)) + +(defun monte-carlo (samples) + "Returns an approximation of pi" + (loop repeat samples + with count = 0 + do + (when (in-circle-p (random 1.0) (random 1.0)) + (incf count)) + finally (return (* (/ count samples) 4.0)))) + +(defvar pi-estimate (monte-carlo 5000000)) +(format t "Estimate: ~D ~%" pi-estimate) +(format t "Error: ~D%" (* (/ (abs (- pi-estimate pi)) pi) 100)) diff --git a/contents/monte_carlo_integration/monte_carlo_integration.md b/contents/monte_carlo_integration/monte_carlo_integration.md index bf9e68838..bc00a7fff 100644 --- a/contents/monte_carlo_integration/monte_carlo_integration.md +++ b/contents/monte_carlo_integration/monte_carlo_integration.md @@ -81,6 +81,8 @@ each point is tested to see whether it's in the circle or not: [import:2-4, lang:"lisp"](code/racket/monte_carlo.rkt) {% sample lang="scala" %} [import:3-3, lang:"scala"](code/scala/monte_carlo.scala) +{% sample lang="lisp" %} +[import:3-5, lang:"lisp"](code/scala/monte-carlo.lisp) {% sample lang="asm-x64" %} [import:21-32, lang:"asm-x64"](code/asm-x64/monte_carlo.s) {% endmethod %} @@ -163,6 +165,8 @@ Feel free to submit your version via pull request, and thanks for reading! [import, lang:"lisp"](code/racket/monte_carlo.rkt) {% sample lang="scala" %} [import, lang:"scala"](code/scala/monte_carlo.scala) +{% sample lang="lisp" %} +[import, lang:"lisp"](code/scala/monte-carlo.lisp) {% sample lang="asm-x64" %} [import, lang:"asm-x64"](code/asm-x64/monte_carlo.s) {% endmethod %}