23 lines
591 B
Haskell
23 lines
591 B
Haskell
import Control.Monad (foldM, (>=>))
|
|
import System.Random (randomRIO)
|
|
import Data.Functor ((<&>))
|
|
|
|
------- APPROXIMATION TO PI BY A MONTE CARLO METHOD ------
|
|
|
|
monteCarloPi :: Int -> IO Double
|
|
monteCarloPi n =
|
|
(/ fromIntegral n) . (4 *) . fromIntegral
|
|
<$> foldM go 0 [1 .. n]
|
|
where
|
|
rnd = randomRIO (0, 1) :: IO Double
|
|
go a _ = rnd >>= ((<&>) rnd . f a)
|
|
f a x y
|
|
| 1 > x ** 2 + y ** 2 = succ a
|
|
| otherwise = a
|
|
|
|
--------------------------- TEST -------------------------
|
|
main :: IO ()
|
|
main =
|
|
mapM_
|
|
(monteCarloPi >=> print)
|
|
[1000, 10000, 100000, 1000000]
|