module AI.MEP.Random
(
drawFrom
, double_
, uniformIn_
, withProbability
, runRandIO
, RandT
, double
, vectorOf
, vectorOfVariate
, uniformIn
, Variate
) where
import Math.Probable.Random
import System.Random.MWC ( Variate )
import Control.Monad.Primitive ( PrimMonad )
import Data.Vector as V
runRandIO :: RandT IO a -> IO a
runRandIO = mwc
drawFrom :: PrimMonad m => Vector a -> RandT m a
drawFrom vec = do
n <- uniformIn (0, V.length vec 1)
return $ vec V.! n
uniformIn_ :: (PrimMonad m, Variate a, Integral a) => (a, a) -> RandT m a
uniformIn_ (a, b) = uniformIn (a, b 1)
double_ :: PrimMonad m => RandT m Double
double_ = (subtract magicC) <$> double
where
magicC = 2**(53)
withProbability :: PrimMonad m =>
Double
-> (a -> RandT m a)
-> (a -> RandT m a)
withProbability p modify x = do
t <- double
if t < p
then modify x
else return x