Anonymous user
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:
<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.
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
|