Unbias a random generator: Difference between revisions

Line 1,212:
<lang racket>
#lang racket
 
;; Using boolean #t/#f instead of 1/0
 
(define ((randN n)) (zero? (random n)))
(define ((unbiased biased))
(let loop () (let ([r (biased)]) (if (eq? r (biased)) (loop) r))))
 
;; Counts
(define N 1000000)
(for ([n (in-range 3 7)])
(define (try% R) (round (/ (for/sum ([i N]) (if (R) 1 0)) N 1/100)))
(define biased (randN n))
(define nb 0)
(define nu 0)
(for ([i N])
(when (biased) (set! nb (+ 1 nb)))
(when (unbiased biased) (set! nu (+ 1 nu))))
(printf "Count: ~a => Biased: ~a%; Unbiased: ~a%.\n"
n (roundtry% (/ nb N 1/100)biased) (roundtry% (/ nu Nunbiased 1/100biased))))
</lang>
{{out}}