module Sound.SC3.Lang.Random.Monad where
import Control.Monad
import Control.Monad.Random
import Data.Maybe
import qualified Sound.SC3.Lang.Collection as C
import Sound.SC3.Lang.Core
import qualified Sound.SC3.Lang.Math as M
rand :: (RandomGen g,Random n,Num n) => n -> Rand g n
rand n = getRandomR (0,n)
nrand :: (RandomGen g,Random n,Num n) => Int -> n -> Rand g [n]
nrand k = replicateM k . rand
rand2 :: (RandomGen g,Random n,Num n) => n -> Rand g n
rand2 n = getRandomR (n,n)
nrand2 :: (RandomGen g,Random n,Num n) => Int -> n -> Rand g [n]
nrand2 k = replicateM k . rand2
rrand :: (RandomGen g,Random n,Num n) => n -> n -> Rand g n
rrand l r = getRandomR (l,r)
nrrand :: (RandomGen g,Random n,Num n) => Int -> n -> n -> Rand g [n]
nrrand k = replicateM k .: rrand
choose :: RandomGen g => [a] -> Rand g a
choose l = do
i <- rand (length l 1)
return (l !! i)
wchoose :: (RandomGen g,Fractional t,Ord t,Random t) => [a] -> [t] -> Rand g a
wchoose l w = do
i <- rrand 0.0 1.0
let n = fromMaybe (error "wchoose: windex") (C.windex w i)
return (l !! n)
wchoose_N :: (RandomGen g,Fractional t,Ord t,Random t) => [a] -> [t] -> Rand g a
wchoose_N l w = wchoose l (C.normalizeSum w)
nchoose :: (RandomGen g) => Int -> [a] -> Rand g [a]
nchoose k = replicateM k . choose
exprand :: (Floating n,Random n,RandomGen g) => n -> n -> Rand g n
exprand l r = do
n <- rrand 0.0 1.0
return (M.exprange l r n)
nexprand :: (Floating n,Random n,RandomGen g) => Int -> n -> n -> Rand g [n]
nexprand k = replicateM k .: exprand