Ich mache Monte-Carlo-Simulationen und derzeit System.Random
.Schnellste Möglichkeit, eine Milliarde zufällige Doppel in Haskell zu generieren
import System.Random
main = do
g <- newStdGen
let xs = randoms g :: [Double]
-- normally, I'd do other magic here
putStrLn $ show $ length $ take 10^9 xs
Leider dauert dies eine wirklich lange Zeit, mindestens 5-mal langsamer als Python random.random()
, ganz zu schweigen von dem C rand()
Anruf.
Mit ghc -O2 -optc-ffast-math -optc-O3
import System.Random
main = do
g <- newStdGen
let xs = randoms h :: [Double]
putStrLn $ show $ length $ take (10^7) xs
nimmt ~ 8s gegen (in ipython)
import random
%timeit len([random.random() for _ in range(10 ** 7)])
nimmt ~ 1,3 s. Mein Ziel ist eine Milliarde, aber Haskell kann sie nicht in angemessener Zeit generieren.
Ich habe auch ein C++ - Programm, das Floats mit rand()
generiert. Es tut 10^7
Proben in 0,2 Sekunden.
Wie kann ich in Haskell schnell Zufallsdoppelwerte im Bereich [0-1)
erzeugen?
Idealerweise wird das Programm, das GHC generiert, nur rand()
POSIX-Aufrufe senden und in einer Liste sammeln. Die Antwort mit dem saubersten & schnellsten Code gewinnt. (Nein, 10x der Code für 1% Beschleunigung ist es nicht wert.)
Check out [System.Random.MWC] (http://hackage.haskell.org/package/mwc-random) – ErikR
@ user5402 Mit MWC Beispiel 'withSystemRandom. asGenST $ \ gen -> uniformVector gen (10^7) 'Um einen' Vektor' (der effizienter sein sollte) von 10 Millionen Doubles zu erzeugen, dauerte es ungefähr 15 Sekunden auf meinem Computer, während 'System.Random.randoms' verwendet wurde dauerte nur 12,5 Sekunden. Sind Sie sicher, dass dies die Generation wirklich beschleunigen wird? – bheklilr
Dies kann Ihnen helfen: http://stackoverflow.com/questions/4577146/good-choice-for-fast-random-generator-in-haskell – Sibi