;;;; srfi.27.lognormals.scm ;;;; Kon Lovett, Dec '17 ;;;; Kon Lovett, Jun '17 ;;;; Kon Lovett, May '06 ; Chicken Generic Arithmetic! (would use fp routines, except for the "real" constraint) (module srfi.27.lognormals (;export *make-random-lognormals make-random-lognormals) (import scheme (chicken base) (chicken type) (only (type-checks-numbers scheme) check-real) (only type-checks-structured check-procedure) (srfi 27) srfi-27-distributions-support (srfi 27 normals)) ;;; (include-relative "srfi-27-common-types") (: *make-random-lognormals (number number random-real-function -> number-function)) (: make-random-lognormals (#!rest -> number-function procedure)) ;;; Lognormal distribution (define (*make-random-lognormals mu sigma randoms) (let ((normals (*make-random-normals 0 1 randoms) ) (nmu (log (* mu (/ mu (sqrt (+ (* sigma sigma) (* mu mu)))))) ) (nsigma (sqrt (log (+ 1 (* sigma (/ sigma mu mu))))) ) ) ; (lambda () (exp (+ nmu (* (normals) nsigma))))) ) (define (make-random-lognormals #!key mu sigma randoms) ;delay the argument check until known if supplied or default (let ((mu (if (not mu) 1 (check-nonzero-real 'make-random-lognormals mu 'mu))) (sigma (if (not sigma) 1 (check-nonnegative-real 'make-random-lognormals sigma 'sigma))) (randoms (if (not randoms) (current-random-real) (check-procedure 'make-random-lognormals randoms 'randoms))) ) (values (*make-random-lognormals mu sigma randoms) (lambda () (values mu sigma randoms))) ) ) ) ;module srfi.27.lognormals