[Haskell-cafe] Monte Carlo Pi calculation (newbie learnings)
Alex Young
alex at blackkettle.org
Mon Nov 5 16:21:04 EST 2007
Don Stewart wrote:
> alex:
<snip>
> You can replace most of your loops with Data.List functions, and
> simplify the code overall by threading around a lazy list of randoms,
> rather than calling into IO all the time:
>
> import System.Random
> import System.Environment
> import Data.List
> import Control.Monad
>
> randMax = 32767
> unitRadius = randMax * randMax
>
> countPair :: (Int, Int) -> Int
> countPair (x, y) = fromEnum (x*x + y*y < unitRadius)
>
> calculatePi total g = fromIntegral (4*count) / fromIntegral total
> where
> count = sum
> . map countPair
> . take total
> $ zip (randomRs (0,randMax) a)
I wish I'd known about randomRs a couple of hours ago :-)
> (randomRs (0,randMax) b)
>
> (a,b) = split g
>
> main = do
> [v] <- getArgs
> g <- newStdGen
> print $ calculatePi (read v) g
>
> Compiled like so:
>
> $ ghc -O2 A.hs -o A
>
> $ time ./A 100000
> 3.13548
> ./A 100000 0.08s user 0.02s system 98% cpu 0.101 total
>
> We get no stack overflow.
Not with -O2, but:
C:\Users\Alex\Documents\HaskellLearning\MonteCarlo>ghc BetterPi.hs
C:\Users\Alex\Documents\HaskellLearning\MonteCarlo>main.exe 1000000
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize' to increase it.
But:
C:\Users\Alex\Documents\HaskellLearning\MonteCarlo>ghc -O2 BetterPi.hs
C:\Users\Alex\Documents\HaskellLearning\MonteCarlo>main.exe 1000000
3.140636
This is a little confusing. Is there a simple explanation for this
behaviour, or is it just a matter of "always use -O2 unless there's a
reason not to?"
Thanks - I really appreciate the explanations.
(P.S. Again - sorry for the duplication. I really need to watch my
mail client more closely :-)
--
Alex
More information about the Haskell-Cafe
mailing list