srtree-2.0.0.3: apps/rEGGression/Random.hs
module Random where
import System.Random
import Control.Monad.State.Strict
import Control.Monad
import Data.SRTree
import Data.SRTree.Eval
import Data.Massiv.Array as MA
type Rng a = IO a
toss :: Rng Bool
toss = randomIO
{-# INLINE toss #-}
tossBiased :: Double -> Rng Bool
tossBiased p = do r <- randomIO
pure (r < p)
randomVal :: Rng Double
randomVal = randomIO
randomRange :: (Ord val, Random val) => (val, val) -> Rng val
randomRange rng = (randomRIO rng)
{-# INLINE randomRange #-}
randomFrom :: [a] -> Rng a
randomFrom funs = do n <- randomRange (0, length funs - 1)
pure $ funs !! n
{-# INLINE randomFrom #-}
randomVec :: Int -> Rng PVector
randomVec n = MA.fromList compMode <$> replicateM n (randomRange (-1, 1))