2013-07-26 7 views
7

यादृच्छिक संख्या पैदा करने की सी ++ 11 तरीका है:निर्दिष्ट यादृच्छिक वितरण के साथ किस प्रकार का यादृच्छिक संख्या इंजन उपयोग करना है?

  1. एक यादृच्छिक संख्या इंजन
  2. का दृष्टांत वितरण के माध्यम से एक यादृच्छिक वितरण
  3. पुश इंजन से यादृच्छिक संख्या इन्स्तांत

समस्या यह है कि दोनों यादृच्छिक संख्या इंजन और यादृच्छिक वितरण arit के प्रकार के संबंध में टेम्पलेट किए गए हैं आप का उपयोग कर रहे हैं

इन दो प्रकार के अंकगणितीय से संबंधित होने की आवश्यकता कैसे है?

आप वितरण और विपरीत के लिए इंजन के लिए एक 32 बिट पूर्णांक और एक 64 बिट पूर्णांक का उपयोग कर सकते हैं? खतरे क्या हैं? फ़्लोटिंग पॉइंट प्रकारों के बारे में क्या?

मैं एक दिशानिर्देश परिकल्पना करता हूं कि इंजन द्वारा उत्पन्न संभावित संख्याओं की संख्या अलग-अलग यादृच्छिक संख्याओं की संख्या से अधिक या बराबर होनी चाहिए, जिन्हें आप प्राप्त करने की उम्मीद कर रहे हैं। दुर्भाग्य से मैं अपने परिकल्पना का परीक्षण करने में सक्षम नहीं था, क्योंकि मेरे कंप्यूटर uint_fast32_t और uint_fast64_t समान हैं और इसलिए तीन सी ++ 11 जेनरेटर में से प्रत्येक के लिए सुझाए गए इंजन एक ही परिणाम उत्पन्न करते हैं।

सी ++ 11 वितरण std::uniform_real_distribution या std::uniform_int_distribution की तरह पर दस्तावेज़ीकरण इस संबंध में अधूरा है:

यह खंड अधूरा है। कारण: जेनरेटर

पर लेकिन uniform_real_distribution की exapmple gcc 4.7 कार्यान्वयन के लिए आवश्यकताओं है:

template<typename _UniformRandomNumberGenerator> 
result_type 
operator()(_UniformRandomNumberGenerator& __urng, 
     const param_type& __p) 
{ 
    __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> 
    __aurng(__urng); 
    return (__aurng() * (__p.b() - __p.a())) + __p.a(); 
} 

कहाँ एडाप्टर है:

किसी भी उत्पादन परिवर्तित करने के लिए एक एडाप्टर वर्ग एक विशिष्ट वितरण के लिए इनपुट में जेनरेटर।

"किसी भी" आश्वस्त लगता है, लेकिन यह मानक है? मैं विशेष रूप से छिपे हुए अतिप्रवाहों के बारे में चिंतित हूं जो पता लगाना मुश्किल है और जो वितरण की शुद्धता से समझौता कर सकता है।

+1

आवश्यकताएं http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf (पृष्ठ 904 के बाद) में पाई जा सकती हैं। मुझे कोई जवाब नहीं मिला, लेकिन शायद आप कर सकते हैं? – Escualo

उत्तर

2

आपको किसी भी वितरण समारोह के लिए किसी भी वर्दी यादृच्छिक संख्या जनरेटर (यूआरएनजी) का उपयोग करने की अनुमति है। वितरण कार्य को यह जानने के लिए माना जाता है कि इसकी क्या आवश्यकता है, और यूआरएनजी को जो कुछ भी प्रदान करता है उसका वर्णन करने की आवश्यकता है, ताकि वितरण कार्य इसकी आवश्यकताओं के लिए पर्याप्त एन्ट्रॉपी का अनुरोध कर सके। (ध्यान दें कि एक "इंजन" एक यूआरएनजी है, कुछ अतिरिक्त आवश्यकताओं जैसे कि बीजबिलिटी।)

"सार्वभौमिक" अनुकूलक आप जीएनयू मानक पुस्तकालय कार्यान्वयन से उल्लेख एक समान यादृच्छिक संख्या जनरेटर G (वास्तव में यह नाम बहुत लंबे समय तक है, लेकिन वह कठिन मिल जाएगा) और एक परिणाम के प्रकार R लेता है, जो एक अंकीय होना चाहिए प्रकार। G को G::min और G::max परिभाषित करना होगा, जो न्यूनतम और अधिकतम मूल्य लौटा सकता है, और यह समान सीमा के साथ उन सीमाओं के बीच सभी मानों को वापस करना है। तो यह जानना आसान है कि कॉल से G() पर यादृच्छिकता के कितने बिट उपलब्ध हैं। इसके अलावा, numeric_limits<R> से हमें बताएगा कि R के लिए कितने बिट्स की आवश्यकता है। तो उपलब्ध एन्ट्रॉपी द्वारा आवश्यक एन्ट्रॉपी को विभाजित करने से एडाप्टर को एक समान यादृच्छिक R बनाने के लिए G पर कॉल करने की आवश्यकता होती है। इसलिए एडाप्टर कोई यूआरएनजी/इंजन लेता है जो कुछ परिणाम प्रकार उत्पन्न करता है, और इसे एक अलग परिणाम प्रकार का उत्पादन करने के लिए अनुकूलित करता है।

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