Unbias a random generator: Difference between revisions

→‎{{header|Haskell}}: Added examples
(→‎{{header|Haskell}}: Changed to universal monadic solution)
(→‎{{header|Haskell}}: Added examples)
Line 681:
 
=={{header|Haskell}}==
The first task:
 
<lang haskell>import Control.Monad.Random
import Control.Monad
Line 687:
 
randN :: MonadRandom m => Int -> m Int
randN n = fromList [(0, fromIntegral n-1), (1, 1)]</lang>
 
Examples of use:
-- works for any random generator
<pre>λ> replicateM 20 (randN 2)
unbias :: (MonadRandom m, Eq x) => m x -> m x
[0,0,1,0,0,1,0,1,1,0,0,1,1,1,1,0,1,1,0,0]
unbias g = do x <- g
λ> replicateM 20 (randN 5)
[0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,1,0]</pre>
 
The second task. Returns the unbiased generator for any given random generator.
unbias<lang Haskell>unbiased :: (MonadRandom m, Eq x) => m x -> m x
unbiasunbiased g = do x <- g
y <- g
if x /= y then return y else unbias g</lang>
 
Examples of use:
<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]
λ> replicateM 20 (unbias (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>
 
The third task:
<lang Haskell>main = forM_ [3..6] showCounts
where
showCounts b = do
Anonymous user