msplit,
runRandom1, runRandom, runRandomStd, runRandomNewStd,
mrandomR, mrandom,
- withProb,
+ withProb, withWeight,
filterRandomized,
indReplicateRandom, indRepeatRandom, indRandomArray
) where
mrandom :: Random a => Randomized a
mrandom = Randomized random
mrandomR :: Random a => (a, a) -> Randomized a
-mrandomR lohi = Randomized $ randomR lohi
+-- Eta-expand this one to keep GHC 6.6.1 on birdy happy.
+mrandomR lohi = Randomized (\g -> randomR lohi g)
chooseCase :: Double -> [(Double, a)] -> a -> a
chooseCase val ifCs elseR = case ifCs of
val <- mrandom
chooseCase val ifCs elseR
+-- Like withProb, but without an else case and with the "probabilities" scaled
+-- so that they sum to 1.
+withWeight :: [(Double, Randomized a)] -> Randomized a
+withWeight ifCs = do
+ val <- mrandomR (0, sum (map fst ifCs))
+ chooseCase val (tail ifCs) (snd (head ifCs))
+
-- Keep trying until we get what we want.
filterRandomized :: (a -> Bool) -> Randomized a -> Randomized a
filterRandomized f ra = do