Re: interesting example of lazyness/ghc optimisation
I hope nobody actually uses this random number generator. It appears to be linear congruential with period less than 140000. The author of these benchmarks seem to have got this algorithm from "Numerical Recipes", whose code (at least, in the early editions) has come in for some very heavy criticism: http://math.jpl.nasa.gov/nr/nr.html I would take these benchmarks more seriously if "random" implied a slightly more modern algorithm, like the Mersenne Twister (which has been implemented in Haskell I believe). Julian Assange wrote:
Noticing the use of tuples and normalisation at each step of the iteration, I re-wrote this as:
module Main(main) where import System(getArgs) import Numeric(showFFloat)
main = do ~[n] <- getArgs putStrLn (showFFloat (Just 12) (random 42 (read n::Int) 100.0) "") return 1
random :: Int -> Int -> Double -> Double random seed n max = norm (rand n seed) max where norm x max = (fromIntegral x) * (max / imd) rand n x = if n > 0 then rand (n-1) ((x * ia + ic) `mod` im) else x im = 139968 imd = fromIntegral im ia = 3877 ic = 29573
participants (1)
-
George Russell