20 lines
602 B
Racket
20 lines
602 B
Racket
#lang racket
|
||
(require math)
|
||
|
||
(define random-normal
|
||
(let ([unit (uniform-dist)]
|
||
[next #f])
|
||
(λ (μ σ)
|
||
(if next
|
||
(begin0
|
||
(+ μ (* σ next))
|
||
(set! next #f))
|
||
(let loop ()
|
||
(let* ([v1 (- (* 2.0 (sample unit)) 1.0)]
|
||
[v2 (- (* 2.0 (sample unit)) 1.0)]
|
||
[s (+ (sqr v1) (sqr v2))])
|
||
(cond [(>= s 1) (loop)]
|
||
[else (define scale (sqrt (/ (* -2.0 (log s)) s)))
|
||
(set! next (* scale v2))
|
||
(+ μ (* σ scale v1))])))))))
|