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 let im = foldr (I.update ((Just $!) . succ)) im0 rd im0 = I.fromList $ zip [1..4] [0,0..] print im rollIkasamaDice :: IO Int rollIkasamaDice = do d <- getStdRandom (randomR (0, 1)) :: IO Double let thr = scanl1 (+) $ map . flip (/) =<< sum $ map sqrt [1..4] a = zip thr [1..] :: [(Double, Int)] return $ snd $ fromJust $ find ((d <=) . fst) a