std::uniform_real_distribution
rand()
से यादृच्छिक संख्या जेनरेटर के रूप में क्यों बेहतर है? क्या कोई उदाहरण दे सकता है?std :: uniform_real_distribution और rand()
उत्तर
वास्तविक तुलना rand
और सी ++ 11 मानक पुस्तकालय द्वारा प्रदान किए गए यादृच्छिक संख्या इंजनों में से एक है। std::uniform_real_distribution
कुछ पैरामीटर के अनुसार इंजन के आउटपुट को वितरित करता है (उदाहरण के लिए, 10 और 20 के बीच वास्तविक मान)। आप दृश्यों के पीछे rand
का उपयोग करने वाले इंजन को भी बना सकते हैं।
अब मानक लाइब्रेरी यादृच्छिक संख्या इंजन के बीच का अंतर और सादे पुराने rand
का उपयोग गारंटी और लचीलापन में है। rand
यादृच्छिक संख्या की गुणवत्ता के लिए कोई गारंटी प्रदान नहीं करता है - वास्तव में, कई कार्यान्वयनों में उनके वितरण और अवधि में कमी होती है। यदि आप कुछ उच्च गुणवत्ता वाले यादृच्छिक संख्या चाहते हैं, तो rand
बस नहीं करेगा। हालांकि, यादृच्छिक संख्या इंजन की गुणवत्ता उनके एल्गोरिदम द्वारा परिभाषित की जाती है। जब आप std::mt19937
का उपयोग करते हैं, तो आप जानते हैं कि आप इस पूरी तरह से परीक्षण और विश्लेषण एल्गोरिदम से क्या प्राप्त कर रहे हैं। विभिन्न इंजनों में अलग-अलग गुण होते हैं जिन्हें आप पसंद कर सकते हैं (अंतरिक्ष दक्षता, समय दक्षता, आदि) और सभी विन्यास योग्य हैं।
यह कहना नहीं है कि आपको rand
का उपयोग करना चाहिए जब आपको बहुत अधिक परवाह नहीं है। आप तुरंत सी ++ 11 से यादृच्छिक संख्या पीढ़ी की सुविधाओं का उपयोग करना शुरू कर सकते हैं। कोई नकारात्मक नहीं है।
कारण समारोह है, जो तथ्य यह है कि यादृच्छिक संख्या के वितरण की एकरूपता यादृच्छिक संख्या कि rand()
प्रदान करता है के समान वितरण की तुलना में std::uniform_real_distribution
के साथ बेहतर है के नाम पर वास्तव में है।
std::uniform_real_distribution
के लिए वितरण एक निश्चित अंतराल [ए, बी) के बीच निश्चित रूप से है।
अनिवार्य रूप से, कि कह रहा है कि संभावना घनत्व है कि जब आप 1 से 10 एक यादृच्छिक संख्या के लिए पूछना 5 हो रही या 9 संभावित मानों की किसी अन्य std::uniform_real_distribution
साथ हो रही या के रूप में जब आप के रूप में महान है ' डी rand()
के साथ ऐसा करें और इसे कई बार कॉल करें, 9 के बजाय 5 प्राप्त करने की संभावना अलग हो सकती है।
लेकिन यदि मैं यादृच्छिक संख्या उत्पन्न करने के लिए कोई फ़ंक्शन लिखता हूं, तो क्या यह एक अच्छा अनुमान है या फिर भी std :: uniform_real_distribution का उपयोग करना बेहतर है? –
सभी संभावित मूल्यों की संभावना बराबर है? मुझे अत्यधिक संदेह है, यह एक समान वितरण नहीं होगा क्योंकि फ्लोटिंग-पॉइंट मानों की घनत्व अलग-अलग पैमाने पर अलग होती है। समानता क्या होना चाहिए संभावना _density_। – leftaroundabout
सबसे पहले, यह स्पष्ट किया जाना चाहिए कि प्रस्तावित तुलना गैरकानूनी है।
uniform_real_distribution
यादृच्छिक संख्या जेनरेटर नहीं है। आप यादृच्छिक संख्या जनरेटर के बिना से यादृच्छिक संख्या उत्पन्न नहीं कर सकते हैं जिसे आप operator()
पर भेजते हैं। uniform_real_distribution
उस यादृच्छिक संख्या जेनरेटर के आउटपुट को एक समान वास्तविक वितरण में "आकार" देता है। आप वितरण में विभिन्न प्रकार के यादृच्छिक संख्या जेनरेटर प्लग कर सकते हैं।
मुझे नहीं लगता कि यह एक सभ्य तुलना के लिए बनाता है, इसलिए मैं uniform_real_distribution
के साथ rand()
के विरुद्ध एक सी ++ 11 यादृच्छिक संख्या जेनरेटर के उपयोग की तुलना करूँगा।
एक और स्पष्ट अंतर जो तुलना को कम उपयोगी बनाता है यह तथ्य है कि uniform_real_distribution
फ्लोटिंग पॉइंट नंबरों का उत्पादन करने के लिए उपयोग किया जाता है, जबकि rand()
पूर्णांक उत्पन्न करता है।
ने कहा, नई सुविधाओं को प्राथमिकता देने के कई कारण हैं।
rand()
वैश्विक स्थिति है, जबकि <random>
से सुविधाओं का उपयोग करते समय कोई वैश्विक स्थिति शामिल नहीं है: आप जितने चाहें उतने जेनरेटर और वितरण प्राप्त कर सकते हैं और वे सभी एक-दूसरे से स्वतंत्र हैं।
rand()
उत्पन्न अनुक्रम की गुणवत्ता के बारे में कोई विनिर्देश नहीं है। सी ++ 11 से यादृच्छिक संख्या जनरेटर सभी अच्छी तरह से निर्दिष्ट हैं, और इसलिए वितरण भी हैं। rand()
कार्यान्वयन हो सकता है, और व्यावहारिक रूप से, बहुत खराब गुणवत्ता, और बहुत समान नहीं है।
rand()
एक पूर्वनिर्धारित सीमा के भीतर एक यादृच्छिक संख्या प्रदान करता है। वांछित सीमा तक उस सीमा को समायोजित करने के लिए प्रोग्रामर पर निर्भर है। यह एक आसान काम नहीं है। नहीं, यह% कुछ का उपयोग करने के लिए पर्याप्त नहीं है। इस तरह के बेवकूफ तरीके से इस प्रकार के समायोजन को करने से मूल अनुक्रम में जो भी समानता हो सकती है, वह अधिकतर नष्ट हो जाएगी। uniform_real_distribution
आपके लिए यह सीमा समायोजन सही तरीके से करता है।
आप क्यों कह रहे हैं कि 'uniform_real_distribution' यादृच्छिक संख्या जनरेटर नहीं है? तब आपके लिए आरएनजी क्या है? – akappa
ग्रेट जानकारी, लेकिन क्या आप इसे स्पष्ट कर सकते हैं कि दूसरे पैरा pls - यह भ्रमित है - विशेष रूप से क्योंकि http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution का अर्थ यह है कि यह एक यादृच्छिक संख्या जनरेटर है (मुझे संदेह है एक सूक्ष्म अंतर है जिसे मैं नहीं देखता) – Caribou
@akappa std :: mt19937, या std :: knuth_b जैसे कुछ उदाहरण के लिए। 'uniform_real_distribution', जैसा कि नाम इंगित करता है, केवल एक यादृच्छिक संख्या वितरण है। देखें कि इसके 'ऑपरेटर() 'के लिए तर्क क्या है: जनरेटर! –
इसके अलावा, जेनरेटर को सभी प्लेटफार्मों पर एक ही अनुक्रम (उसी बीज को दिया गया) उत्पन्न करना आवश्यक है, जो पुनरुत्पादन के लिए महत्वपूर्ण है। –