import qualified Data.IntMap as I import Control.Monad import Data.List import Data.Maybe import System.Random main :: IO () main = do rd <- replicateM 100000 $ rollIkasamaDice (take 6 $ cycle [1,2]) rd1 <- replicateM 100000 $ rollIkasamaDice (map sqrt [1..4]) let im = foldr (I.update ((Just $!) . succ)) im0 rd im0 = I.fromList $ zip [1..6] [0,0..] print im rollIkasamaDice :: [Double] -> IO Int rollIkasamaDice dist = do d <- getStdRandom (randomR (0, 1)) :: IO Double let thr = scanl1 (+) $ map . flip (/) =<< sum $ dist a = zip thr [1..] :: [(Double, Int)] return $ snd $ fromJust $ find ((d <=) . fst) a