msplit,
runRandom1, runRandom, runRandomStd, runRandomNewStd,
mrandomR, mrandom,
- withProb,
+ withProb, withWeight,
filterRandomized,
indReplicateRandom, indRepeatRandom, indRandomArray
) where
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