Unbias a random generator: Difference between revisions

Content added Content deleted
Line 699: Line 699:
unbiased g = do x <- g
unbiased g = do x <- g
y <- g
y <- g
if x /= y then return y else unbias g</lang>
if x /= y then return y else unbiased g</lang>


Examples of use:
Examples of use:
<pre>λ> replicateM 20 (unbiased (randN 5))
<pre>λ> replicateM 20 (unbiased (randN 5))
[0,0,1,0,1,1,1,0,0,0,1,1,1,0,1,1,0,0,1,0]
[0,0,1,0,1,1,1,0,0,0,1,1,1,0,1,1,0,0,1,0]
λ> replicateM 20 (unbias (fromList [(True,10),(False,1)]))
λ> replicateM 20 (unbiased (fromList [(True,10),(False,1)]))
[True,True,False,True,True,True,False,True,False,True,True,False,False,True,False,True,True,False,False,True]</pre>
[True,True,False,True,True,True,False,True,False,True,True,False,False,True,False,True,True,False,False,True]</pre>


Line 712: Line 712:
showCounts b = do
showCounts b = do
r1 <- counts (randN b)
r1 <- counts (randN b)
r2 <- counts (unbias (randN b))
r2 <- counts (unbiased (randN b))
printf "n = %d biased: %d%% unbiased: %d%%\n" b r1 r2
printf "n = %d biased: %d%% unbiased: %d%%\n" b r1 r2