में एक अरब यादृच्छिक युगल उत्पन्न करने का सबसे तेज़ तरीका मैं मोंटे-कार्लो सिमुलेशन कर रहा हूं, और वर्तमान में System.Random
का उपयोग कर रहा हूं।हास्केल
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
दुर्भाग्य से, यह सी rand()
कॉल का कुछ भी नहीं कहने के लिए एक बहुत लंबा समय लगता है, कम से कम 5x पायथन के random.random()
की तुलना में धीमी,।
साथ 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
~ 8s लेता बनाम (IPython में)
import random
%timeit len([random.random() for _ in range(10 ** 7)])
लेता है ~ 1.3s। मेरा लक्ष्य एक अरब है, लेकिन हास्केल उन्हें उचित समय में उत्पन्न नहीं कर सकता है।
मेरे पास एक सी ++ प्रोग्राम भी है जो rand()
के साथ फ्लोट उत्पन्न करता है। यह 10^7
0.2s में नमूने करता है।
मैं हास्केल में [0-1)
श्रेणी में यादृच्छिक युगल कैसे उत्पन्न कर सकता हूं?
आदर्श रूप से, प्रोग्राम जीएचसी जेनरेट करता है केवल rand()
पॉज़िक्स कॉल करता है और एक सूची में एकत्रित होता है। सबसे स्वच्छ & सबसे तेज़ कोड के साथ उत्तर जीतता है। (नहीं, 1% स्पीडअप के लिए 10x कोड होने के लायक नहीं है।)
जांच [System.Random.MWC] (http://hackage.haskell.org/package/mwc-random) – ErikR
@ user5402 'withSystemRandom की MWC के उदाहरण का उपयोग करना। asGenST $ \ gen -> वर्दी वेक्टर जीन (10^7) '10 मिलियन युगल के 'वेक्टर' (जो अधिक कुशल होना चाहिए) उत्पन्न करने के लिए, 'System.Random.randoms' का उपयोग करते समय, मेरे कंप्यूटर पर लगभग 15 सेकंड लग गए केवल 12.5 सेकंड लिया। क्या आप वाकई पीढ़ी को तेज करेंगे? – bheklilr
यह आपकी मदद कर सकता है: http://stackoverflow.com/questions/4577146/good-choice-for-fast-random- जनरेटर-in-haskell – Sibi