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 |
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 ( |
λ> 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 ( |
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 |
||