import System.Random import Control.Monad.State import Control.Applicative monteCarlo :: (Random a, RandomGen g) => Int -> (a,a) -> (a -> Bool) -> g -> Double monteCarlo count reg cond gen = fromIntegral hits / fromIntegral count where rands = take count (randomRs reg gen) hits = length (filter cond rands) instance (Random a, Random b, Random c) => Random (a,b,c) where random = runState (liftA3 (,,) (state random) (state random) (state random)) randomR ((x1,y1,z1), (x2,y2,z2)) gen1 = let (x, gen2) = randomR (x1, x2) gen1 (y, gen3) = randomR (y1, y2) gen2 (z, gen4) = randomR (z1, z2) gen3 in ((x,y,z), gen4) main = do gen <- getStdGen print (monteCarlo 10000 ((0.0,0.0,0.0),(1.0,1.0,1.0)) isTriangle gen) where isTriangle :: (Double,Double,Double) -> Bool isTriangle (x,y,z) = x+y>z && y+z>x && z+x>y