円周率モンテカルロ

ついでに円周率を。

pi' = do let t = 100000
         nums <- sequence(map sequence (replicate t (replicate 2 randomFIO)))
         putStrLn $ show $ (fromIntegral(length(filter f nums)  )/fromIntegral(t)) * 4
      where
         f :: [Float] -> Bool
         f = (< 1). sum.map(^2)   
         randomFIO :: IO Float
         randomFIO = randomIO

実行結果

*Main> pi'
3.13396
*Main> pi'
3.14472
*Main> pi'
3.13884

若干ゆとり教育気味。