История изменений
Исправление quasimoto, (текущая версия) :
По мелочи:
import System.Random
import Data.List
randomNorm :: IO Double
randomNorm = do
u <- randomIO
v <- randomIO
return $! sqrt (-2 * log u) * cos (2 * pi * v)
-- ^ rnf (x :: Double) = x `seq` ()
sum' :: Num a => [a] -> a
sum' = foldl' (+) 0
reverseReplicateM :: Monad m => Int -> m a -> m [a]
-- ^
-- > reverseReplicateM 2 getLine
-- 1
-- 2
-- ["2","1"]
reverseReplicateM n_ e = go n_ [] where
go n a = if n <= 0 then return a else e >>= go (n - 1) . (: a)
main :: IO ()
main = print =<< sum' `fmap` reverseReplicateM 1000000 randomNorm
Исправление quasimoto, :
По мелочи:
import System.Random
import Data.List
randomNorm :: IO Double
randomNorm = do
u <- randomIO
v <- randomIO
return $! sqrt (-2 * log u) * cos (2 * pi * v)
-- ^ rnf (x :: Double) = x `seq` ()
sum' :: Num a => [a] -> a
sum' = foldl' (+) 0
reverseReplicateM :: Monad m => Int -> m a -> m [a]
-- ^
-- > reverseReplicateM 2 getLine
-- 1
-- 2
-- ["2","1"]
reverseReplicateM n_ e = go n_ [] where
go n a = if n <= 0 then return a else e >>= \x -> go (n - 1) (x : a)
main :: IO ()
main = print =<< sum' `fmap` reverseReplicateM 1000000 randomNorm
Исходная версия quasimoto, :
По мелочи:
import System.Random
import Data.List
randomNorm :: IO Double
randomNorm = do
u <- randomIO
v <- randomIO
return $! sqrt (-2 * log u) * cos (2 * pi * v)
-- ^ rnf (x :: Double) = x `seq` ()
sum' :: Num a => [a] -> a
sum' = foldl' (+) 0
reverseReplicateM :: Monad m => Int -> m a -> m [a]
-- ^
-- > reverseReplicateM 2 getLine
-- 1
-- 2
-- ["2","1"]
reverseReplicateM n_ e = go n_ [] where
go n a = if n == 0 then return a else e >>= \x -> go (n - 1) (x : a)
main :: IO ()
main = print =<< sum' `fmap` reverseReplicateM 1000000 randomNorm