2013-04-07 28 views
5

मैं सहेजने के लिए इस बढ़ावा यादृच्छिक जनरेटर के/लोड राज्य में सक्षम होना चाहिए:तेज़ विकल्प यादृच्छिक जनरेटर राज्य

std::ostringstream content; 
content << this->generator.engine(); 

:

boost::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<> > generator; 

मैं इसे इस तरह से करना समस्या यह है कि यह अविश्वसनीय रूप से धीमा है, क्या इसे स्टोर करने का कोई वैकल्पिक तरीका नहीं है? (या देशी प्रारूप में यादृच्छिक जेनरेटर डेटा का उपयोग करें)। यह कोड हमारे RandomGenerator कक्षा में encapsulated है, तो यह थोड़ा बुरा हो सकता है।

+0

यह लिखना मेरे 2.26 गीगाहर्ट्ज मैक मिनी पर लगभग 0.13 मिलीसेकंड लेता है। यह कितनी तेजी से होना चाहिए? – rhashimoto

+4

मुझे पता नहीं, 2 9 3800 सीपीयू चक्र लंबे समय की तरह लगते हैं! – Yakk

+0

ऐसा लगता है कि राज्य को बचाने और पुनर्स्थापित करने का एकमात्र तरीका एक धारा के माध्यम से है। प्रदर्शन में सुधार करने के लिए, आप अपनी खुद की कस्टम स्ट्रीम ('std :: streambuf' से प्राप्त) लिख सकते हैं और उसमें पढ़ सकते हैं या boost :: iostreams में देख सकते हैं। –

उत्तर

1

तरीकों में से एक जोड़े, दोनों बहुत hacky:

  1. वैसे ही जैसे कुछ का उपयोग कर कच्चे बाइट्स हड़पने:

    typedef typename std::aligned_storage<sizeof(boost::mt19937)>::type mt19937_storage; 
    mt19937_storage storage; 
    std::memcpy(&storage, &generator, sizeof(generator)); 
    //... 
    generator.engine() = *reinterpret_cast<boost::mt19937*>(storage); 
    

    यह इन-स्मृति को बचाने और लोड हो रहा है, लेकिन सटीक के लिए ठीक काम करता है प्रारूप स्पष्ट रूप से संकलक-और-वास्तुकला-निर्भर होगा, इसलिए यदि आपको पोर्टेबल दृढ़ता की आवश्यकता है तो यह काम नहीं करेगा। अतिरिक्त सावधानी के बिंदुओं के लिए, पर भविष्य में परिवर्तन (संभावना नहीं) के खिलाफ सुरक्षा के लिए is_trivially_copyable जैसे कुछ के लिए आप static_assert में फेंक सकते हैं।

  2. बूस्ट लाइसेंस की शर्तों को मानना ​​स्वीकार्य है (वे शायद हैं), बूस्ट के mersenne_twister टेम्पलेट की अपनी प्रति बनाएं और इसे राज्य सरणी के लिए सूचक और सरणी अनुक्रमणिका के संदर्भ को स्वीकार करने के लिए इसे ट्वीक करें। फिर राज्य इंजन के लिए पूरी तरह से बाहरी है, और आप इसे किसी भी तरह से प्रबंधित कर सकते हैं।

संयोग से, अगर यह एक बहुत ही लगातार आपरेशन है और आप MT19937 के uber उच्च आयामी एकरूपता की जरूरत नहीं है, आप इस तरह taus88 जैसे छोटे राज्य की आवश्यकताओं, के साथ एक different engine उपयोग करने पर विचार हो सकता है।

+0

दाएं, 2^19937-1 लंबाई चक्र की आवश्यकता हमारे मुकाबले ज्यादा है, और taus88 में 200 गुना छोटा आकार है, इसलिए मैं इसे आजमाउंगा :) – kovarex

संबंधित मुद्दे