2016-08-14 14 views
13

हमारे पास uniform_int_distribution और uniform_real_distribution है, क्या यह निर्दिष्ट होने पर uniform_distribution, जो फ्लोट/डबल और int/... में निर्दिष्ट होता है, संभव नहीं है?कोई वर्दी_डिस्ट्रिब्यूशन क्यों नहीं है?

+9

एक विचार: uniform_int_distribution एक बंद अंतराल का उपयोग करता है, uniform_real_distribution आधे खुले अंतराल का उपयोग करता है। – user877329

+0

क्या आप अपनी खुद की संरचना को परिभाषित नहीं कर सकते हैं और इसे विशेषज्ञ बना सकते हैं? यह वास्तव में तुच्छ है। – skypjack

+0

@AmiTavory [संदर्भ] (http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution) सहमत नहीं है। अन्यथा आप INT_MAX और इसके समान नहीं प्राप्त कर पाएंगे। संपादित करें: '[rand.dist.uni.int]' में मानक भी सहमत नहीं है, यह कहता है: _A 'uniform_int_distribution' यादृच्छिक संख्या वितरण यादृच्छिक पूर्णांक I उत्पन्न करता है, एक <= i <= b_ –

उत्तर

14

AFAIU, @ user877329 और @revolver_ocelot द्वारा उपरोक्त टिप्पणियों को यह सही ढंग से समझाएं, और दूसरा उत्तर पूरी तरह से गलत है।

यह uniform_int और uniform_real के इंटरफेस को एकजुट करने के गलत है, नहीं है क्योंकि वे अलग तरह से (जो टेम्पलेट विशेषज्ञता के माध्यम से हल किया जा सकता) लागू किया जाता है, लेकिन क्योंकि इंटरफेस अलग बातें मतलब है।

मान लीजिए हम इंटरफेस (अन्य जवाब में सुझाव की भिन्नता का प्रयोग करके) को एकजुट, इसलिए जैसे:

template <typename T> 
using uniform_distribution = 
    typename std::conditional< 
     std::is_integral<T>::value, 
     std::uniform_int_distribution<T>, 
     std::uniform_real_distribution<T> 
    >::type; 

तो अगर हम uniform_distribution<some_type> u(0, 9) परिभाषित करते हैं, जिसका अर्थ है बहुत अलग है:

  • यदि some_type अभिन्न है, तो आप उस समय के लगभग 1/10 वें समय आउटपुट करेंगे।

    #include <random> 
    #include <iostream> 
    #include <type_traits>           
    
    template <typename T> 
    using uniform_distribution = 
        typename std::conditional< 
         std::is_integral<T>::value, 
         std::uniform_int_distribution<T>, 
         std::uniform_real_distribution<T> 
        >::type; 
    
    int main() 
    { 
        std::random_device rd; 
        std::mt19937 gen(rd()); 
    
        { 
         uniform_distribution<int> u(0, 9); 
         bool over_found = false; 
         for(size_t i = 0; i < 99999; ++i) 
          over_found = over_found || u(gen) >= 9; 
         std::cout << std::boolalpha << over_found << std::endl; 
        } 
    
        { 
         uniform_distribution<float> u(0, 9); 
         bool over_found = false; 
         for(size_t i = 0; i < 99999; ++i) 
          over_found = over_found || u(gen) >= 9; 
         std::cout << std::boolalpha << over_found << std::endl; 
        } 
    } 
    

    इस कोड:

  • अगर some_type नहीं है, तो u होगा कभी नहीं उत्पादन 9.

निम्नलिखित कोड (जिसका उत्पादन true और फिर false है) इस दिखाता है दिखाता है कि इस वर्ग का उपयोग कर जेनेरिक कोड लिखना खतरनाक है। उदाहरण के लिए, यदि आप subranges में परिणामों के हिस्टोग्राम की गणना करने वाला एक सामान्य कार्य लिखेंगे: [0, 1), [1, 2), ..., [8, 9), परिणाम असंगत होंगे ।


@revolver_ocelot बताते हैं के रूप में, मानक पुस्तकालय के [inclusive-begin, exclusive_end) convention, वर्दी पूर्णांकों के लिए इस्तेमाल नहीं किया जा सकता है (क्योंकि यह एक समान पूर्णांक यादृच्छिक संख्या जनरेटर पैदा भी अधिकतम uint मूल्य निर्दिष्ट करने के लिए असंभव हो जाएगा) यह एक असाधारण हस्ताक्षर बनाने ।

+2

समावेशी या अनन्य सीमा कोई फर्क नहीं पड़ता क्योंकि एक विशिष्ट वास्तविक संख्या प्राप्त करने की संभावना 9 जैसे 0 है, इसलिए 9 को कभी भी देखने की उम्मीद नहीं है। माना जाता है कि गणित के अर्थ में वास्तविक संख्याएं वास्तविक नहीं हैं, लेकिन यह अंतर नगण्य है क्योंकि हम यादृच्छिक संख्याओं और फ्लोट्स के बारे में बात कर रहे हैं और युगल केवल वास्तविकताओं के अनुमान हैं। – nwp

+0

@nwp इसलिए जेनेरिक फ़ंक्शन को हिस्टोग्राम ड्राइंग के बारे में भी मेरी टिप्पणी। निश्चित रूप से * [8, 9) * जैसे किसी ईवेंट की संभावना गणित जैसी वास्तविक संख्याओं के लिए भी nonzero है। दुर्भाग्य से, मानक-पुस्तकालय प्रकार डिब्बे, इन घटनाओं के संघ को दिए गए परिणामों के एक गैर-नगण्य भाग को छोड़ देंगे। एक बहुत व्यावहारिक अर्थ में, ये हस्ताक्षर सिर्फ अलग हैं। –

+2

@nwp: "एक विशिष्ट वास्तविक संख्या प्राप्त करने की संभावना 9 जैसे 0 है वैसे भी" - यह असत्य है, क्योंकि 'uniform_real_distribution' नाम के बावजूद असली संख्याओं पर निरंतर वितरण नहीं है। यह तर्कसंगत संख्याओं के सीमित सबसेट पर एक अलग वितरण है जिसे 'रीयलटाइप' द्वारा दर्शाया गया है (जो डिफ़ॉल्ट रूप से 'डबल' है)। इसलिए एंडपॉइंट को शामिल या छोड़कर * करता है * एक फर्क पड़ता है। –

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