(require 'stdlib) (define boardsize 1000) (define (in-circle-p coord radius) (let ((x (car coord)) (y (cdr coord))) (<= (+ (* x x) (* y y)) (* radius radius)))) (define (generate-sample) (define (one-sample) (- (random boardsize) (/ boardsize 2))) (cons (one-sample) (one-sample))) (define (do-n-samples n) (let ((in 0) (out 0)) (dotimes i n (if (in-circle-p (generate-sample) (/ boardsize 2)) (setq in (1+ in)) (setq out (1+ out)))) (cons in out))) ;; stel radius 1, ;; oppervlakte vierkant = 2 * 2 = 4 ;; oppervlakte circel = PI * 1^2 = PI ;; verhouding oppervlakte circel : vierkant = PI : 4 ;; verhouding samples in : totaal = PI : 4 ;; PI = 4 * in/N (define (approx-pi n) (let ((result (do-n-samples n))) (exact->inexact (* 4 (/ (car result) n)))))