[Haskell-cafe] Re: True Random Numbers
Gökhan San
gsan at stillpsycho.net
Fri Apr 9 06:51:03 EDT 2010
mokus at deepbondi.net writes:
> are you using the hackage-released version of random-fu or the darcs
> one?
I was using the hackage version, but since then I switched to the darcs
version. (Btw, began using it in some of my projects and I'm really
happy about it.)
> In the above case, I was using IO in the first bgroup and State StdGen
> in the second.
I'm running it on a x86_64 Gentoo Linux box with GHC 6.10.4 and was
unable to install Criterion (apparently, impossible is happening while
compiling vector-algorithms) so I used 'time' to come up with some
results.
Below doesn't include IO tests (randomRIO, etc.), since they turned out
to be spectacularly slow anyway. Results using ghc -O2.
> module Main (main) where
> import Data.Random
> import Data.List
> import Control.Monad.State
> import Control.Monad.Random
> import System.Random
> test = p1 `fmap` getStdGen
> type RType = Double
/usr/bin/time results for (test, RType):
(p1, Double) : ~3.3 secs
(p2, Double) : ~1.7 secs
(p3, Double) : ~1.0 sec
(p1, Int) : ~1.9 secs
(p2, Int) : ~1.0 sec
(p3, Int) : ~0.5 sec
> count = 10 ^ 6
> range = (-10, 10)
> type P = StdGen -> [RType]
> p1 = evalState (sample (replicateM count (uncurry uniform range))) :: P
> p2 = evalRand (replicateM count (getRandomR range)) :: P
> p3 = take count . evalRand (getRandomRs range) :: P
> main = test >>= (print . foldl' (+) 0)
Using 'sum' turned to be rather misleading (took up to a minute to sum
up 'Double's; this problem was less apparent for p1), so I had to use
foldl' here to get consistent results between 'Int's and
'Double's. '`using` rnf' produced similar results.
Also, using DevURandom for random-fu produces almost the same results.
--
Gökhan San
More information about the Haskell-Cafe
mailing list