2009-07-22 12 views
7

अब तक मैं यादृच्छिक संख्या उत्पन्न करने के लिए सी # Mersenne Twister यहां पाया उपयोग कर रहे हैं:सी # Mersenne ट्विस्टर यादृच्छिक पूर्णांक जनरेटर कार्यान्वयन (SFMT) मोंटे कार्लो सिमुलेशन

http://www.centerspace.net/resources.php

मैं बस की खोज की SFMT है जो दोगुनी गति से यहाँ होना चाहिए:

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/

क्या कोई मुझे एसएफएमटी के सी # कार्यान्वयन पर इंगित कर सकता है?

मेरी आवश्यकताएं 0 और 2^20 (1048576) के बीच एक पूर्णांक उत्पन्न करने के लिए हैं।

मुझे 24 घंटे की घड़ी पर चलने वाले सिमुलेशन के लिए प्रति दिन ट्रिलियन करने की आवश्यकता है, इसलिए मैं इसे पूर्णता में बदलने के लिए तैयार हूं। विधि genrand_int32() का उपयोग

public uint Next20() 
{    
    return (uint)(genrand_int32() >> 12); 
} 

मैं अपने खुद के संस्करण, genrand_int20(), कि एक उत्पन्न करता है निर्माण करने के लिए करना चाहते हैं:

वर्तमान में मैं अपने आवश्यकताओं फिट करने के लिए एक नई विधि जोड़कर केंद्र अंतरिक्ष Mersenne ट्विस्टर बदलाव किया है पर सहेजने के लिए 0 और 2^20 के बीच पूर्णांक ऊपर कास्ट करें और को बदलें लेकिन मैं गणित को समझ नहीं पा रहा हूं। वास्तव में मैं यह कैसे कर सकता हूं?

भी का उपयोग कर रहा है जो तेजी से है, या केवल पता योग्य संख्याओं का मामला है? क्योंकि मुझे केवल 1048576 की जरूरत है, मैं केवल गति से चिंतित हूं।

इसके अलावा इस एक विंडोज सर्वर नेट 2. प्रोसेसर के साथ 2003 R2 SP2 (32 बिट) बॉक्स पर चल रहे हो जाएगा AMD Opteron 275 (4 कोर) है।

+0

एक 20-बिट संख्या श्रेणी का प्रतिनिधित्व करेंगी 0 से 2^20-1 समावेशी, 2^20 21 बिट्स का प्रतिनिधित्व करने के लिए (एक 1 के बाद 20 शून्य) –

+1

निफ्ले: एक * अंतराल * के साथ जेनरेटर (जो अनुक्रम की लंबाई है) के * अवधि * को भ्रमित न करें जिसमें आप यादृच्छिक संख्या चाहते हैं। – Joey

+0

@ पैट्रिक धन्यवाद आप सही हैं 2^20-1 जो ​​मुझे चाहिए, मुझे यादृच्छिक रूप से लंबाई 2^20 की सरणी में अनुक्रमित करने की आवश्यकता है। – m3ntat

उत्तर

5

आप क्या कर सकते हैं source from the link को आपने कोड प्रोजेक्ट पर खोजा है। इसे अनजिप करें, विजुअल स्टूडियो में समाधान लोड करें और इसे संकलित करें। यह आपको स्रोत, एक अप्रबंधित सी डीएल और एक .lib फ़ाइल देगा।

आप इस डीएलएल में कार्यों को पी/आमंत्रित कर सकते हैं, (केवल 5 साधारण फ़ंक्शंस निर्यात किए जाते हैं, जिनमें से आपको केवल दो की आवश्यकता होती है) या आप एक प्रबंधित रैपर बनाने के लिए इस डीएलएल, लिब और एसएफएमटी हेडर फ़ाइल का उपयोग कर सकते हैं डीएल आप पी/Invoke के बिना सी # में उपयोग कर सकते हैं। मैंने अभी इस विधि की कोशिश की और यह करना बहुत आसान था। इसमें कोई स्पष्ट मार्शलिंग शामिल नहीं था।

यहां बताया गया है। एक बार जब आपने स्रोत डाउनलोड किया है और संकलित किया है (आपको शीर्षलेख और lib फ़ाइल जो डीएल के अतिरिक्त बनाई गई है) को एक नया सी ++ सीएलआर क्लास लाइब्रेरी प्रोजेक्ट बनाएं। इसे WrapSFMT या कुछ कहें। परियोजना गुणों पर जाएं। सी ++/प्रीकंपिल्ड हेडर के तहत, "प्रीकंपील्ड हेडर का उपयोग न करें" में बदलें। लिंकर/सामान्य/अतिरिक्त लाइब्रेरी निर्देशिकाओं के तहत, SFMT.lib के पथ दर्ज करें। लिंकर/इनपुट/अतिरिक्त निर्भरता के तहत, SFMT.lib जोड़ें। संपत्ति पृष्ठों को बंद करें। अपने प्रोजेक्ट फ़ोल्डर में SFMT.h कॉपी करें और इसे प्रोजेक्ट में शामिल करें।

संपादित WrapSFMT.h इस प्रकार पढ़ने के लिए:

#pragma once 
#include "SFMT.H" 

using namespace System; 

namespace WrapSFMT { 

public ref class SRandom 
{ 
public:SRandom(UInt32); 
public:UInt32 Rand32(void); 
}; 
} 

इन विधियों है कि अपने वर्ग में हो जाएगा की घोषणा। अब पढ़ने के लिए WrapSFMT.cpp संपादित करें:

#include "WrapSFMT.h" 

namespace WrapSFMT { 

SRandom::SRandom(UInt32 seed) 
{ 
    init_gen_rand(seed); 
} 

UInt32 SRandom::Rand32() 
{ 
    return gen_rand32(); 
} 
} 

ये हेडर फ़ाइल में आपके द्वारा घोषित विधियों को लागू करते हैं। आप जो भी कर रहे हैं वह SFMT.dll से फ़ंक्शंस कॉल कर रहा है, और सी ++/सीएलआई स्वचालित रूप से प्रबंधित से प्रबंधित प्रबंधन से रूपांतरण को संभालने में सक्षम है। अब आप WrapSFMT.dll बनाने और इसे अपने सी # प्रोजेक्ट में संदर्भित करने में सक्षम होना चाहिए। सुनिश्चित करें कि SFMT.dll पथ में है, और आपको कोई समस्या नहीं होनी चाहिए।

+0

मैंने अपने डीएलएल डाउनलोड किए और मुझे अपने सी # प्रोजेक्ट के संदर्भ के रूप में जोड़ने की कोशिश की: --------------------------- माइक्रोसॉफ्ट विजुअल स्टूडियो --------------------------- 'SFMTc.dll' का संदर्भ जोड़ा नहीं जा सका। कृपया सुनिश्चित करें कि फ़ाइल पहुंच योग्य है, और यह एक मान्य असेंबली या COM घटक है। --------------------------- ठीक ------------------- -------- कोई विचार? इसका उपयोग कैसे करें और इसे विजुअल स्टूडियो – m3ntat

+0

से सबसे कुशल तरीके से कॉल करें ठीक है मैंने अपने बिन फ़ोल्डर में डीएलएल रखा है, और कोड है: [DllImport ("SFMTc.dll")] स्थिर बाहरी UInt32 gen_rand32(); यह कॉल बिना किसी त्रुटि के है लेकिन मुझे वापस मिल गया है 0, कभी भी कोई अन्य नंबर नहीं। – m3ntat

+0

यदि आप पी/Invoke का उपयोग करना चाहते हैं, तो आपको दो कार्यों, init_gen_rand (UInt32) का आह्वान करना होगा, जेनरेटर को बीज के साथ प्रारंभ करना होगा, और फिर आप जितनी चाहें gen_rand32() को कॉल कर सकते हैं। (लेकिन आपको शायद मेर्सन ट्विस्टर की अवधि से अधिक नहीं होना चाहिए) –

0

मुझे वास्तव में गति के साथ आपकी समस्या वास्तव में नहीं दिखाई देती है। मेरी मशीन (कोर 2 डुओ टी 7200 @ 2 गीगाहर्ट्ज) पर MT19937 या MT19937-64 के साथ एक यादृच्छिक पूर्णांक उत्पन्न करने में लगभग 20 एनएस (औसत पर, 50000 नंबर ड्राइंग करते समय) लेता है। तो यह लगभग 4,32 × 10 (इसलिए लगभग 4 ट्रिलियन नंबर) एक दिन होगा। और यह एक कोर के लिए है। जावा के साथ इसलिए मुझे लगता है कि आप प्रदर्शन की अपेक्षाओं के लिए पर्याप्त से अधिक होने की उम्मीद कर सकते हैं।

वास्तव में आपके प्रश्न का उत्तर देने के लिए: मुझे एसएफएमटी के सी # कार्यान्वयन के बारे में पता नहीं है, लेकिन सी कोड से सी # के रूपांतरण को काफी सरल होना चाहिए। हालांकि, आप ज्यादा लाभ नहीं उठा रहे हैं, क्योंकि एसएमएमटी को सिमड के लिए अनुकूलित किया गया है और सी # वर्तमान में इसका समर्थन नहीं करता है।

+0

मैंने 1,645,668,000,000 पर व्यवसाय का समर्थन करने के लिए इस अनुकरण के लिए दैनिक यादृच्छिक संख्या आवश्यकताओं की गणना की है। सिमुलेशन मुख्य रूप से मैट्रिक्स गुणा की कई अन्य चीजें करता है, इसलिए मैं सभी CPU समय को यादृच्छिक संख्या पीढ़ी में समर्पित नहीं कर सकता, जाहिर है, मैं जितना संभव हो सके प्रत्येक यादृच्छिक संख्या जीन को कम करना चाहता हूं, इसलिए स्टैक ओवरफ्लो प्रश्न। – m3ntat

+1

ठीक है, आपके पास अभी भी कई कोर हैं और मोंटे कार्लो सिमुलेशन बहुत समानांतर हैं।मैं कहूंगा कि आपको पहले आगे बढ़ना चाहिए और अपनी समस्या का समाधान करना चाहिए और समाधान के अलग-अलग हिस्सों पर फिर से जाना चाहिए यदि वे एक प्रदर्शन समस्या साबित होते हैं। – Joey

+0

एसएफएमटी के लिए मुझे एहसास नहीं हुआ कि शायद मेरा सबसे अच्छा तरीका सी संस्करण को संकलित करने का प्रयास करना है: http://www.math.sci.hiroshima-u.ac.jp/~m-mat/bin/dl/ dl.cgi? एसएफएमटी: एसएफएमटी- एसआरसी -1.3.3.zip और फिर किसी भी तरह से मेरे सी # मोंटे कार्लो सिमुलेशन से इसका उपयोग करें। मैं परिचित नहीं हूं कि सी/सी ++ उनके स्रोत को कैसे संकलित करें और सी # से इसका उपयोग कैसे करें। – m3ntat

0

क्या कोई कारण है कि आप सी कार्यान्वयन को डीएलएल में संकलित नहीं कर सकते हैं और इसे अपने सी # कोड से कॉल कर सकते हैं?

संपादित करें:

मैं माफी चाहता हूँ, लेकिन मैं सी (और वास्तव में सी #) का केवल एक बहुत ही सीमित ज्ञान है, लेकिन "एक सी dll बनाने के लिए कैसे करें" यहां उत्तर हो सकता है: http://www.kapilik.com/2007/09/17/how-to-create-a-simple-win32-dll-using-visual-c-2005/ और कोड को प्रोफाइल करके कितनी तेजी से जांच की जा सकती है।

+0

हाय पैट्रिक, मैंने कभी सी का उपयोग नहीं किया है, यह सुनिश्चित नहीं है कि यह कैसे करें? और सी # से उपयोग करते हैं, क्या मैं मानता हूं कि मुझे लगता है कि नेट ने सी # से अंतर्निहित सी डीएलएल में अपनी कॉल की कुछ रैपिंग की है। – m3ntat

+0

मुझे लगता है कि पी/बार-बार गैर-प्रबंधित कोड में आमंत्रित करना एक बहुत ही भारी प्रदर्शन ओवरहेड होता है। – Joey

+0

मैंने अभी यह खोजा है: http://www.codeproject.com/KB/DLL/SFMT_dll.aspx?msg=3130186 मुझे आश्चर्य है कि यह मेरी स्थिति – m3ntat

0

शायद this क्या आप देख रहे हैं? कई कार्यान्वयन की एक सूची है।

विशेष रूप से, this one (कोरी नेल्सन द्वारा) उपयोगी हो सकता है।

1

आपको कम से SFMT (प्लस अन्य RNG एल्गोरिदम) के एक सी # कार्यान्वयन पा सकते हैं ... http://rei.to/random.html पेज और स्रोत कोड टिप्पणी जापानी में हैं, लेकिन आप यह पता लगाने के लिए सक्षम होना चाहिए।

आप किसी Google-अनुवाद पर पेज के (अंग्रेजी के लिए) संस्करण पा सकते हैं ... http://translate.google.com/translate?hl=en&sl=ja&u=http://rei.to/random.html

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