2016-08-09 6 views
7

std::random_device के लिए कॉपी कन्स्ट्रक्टर हटा दिया गया है, और मुझे नहीं पता कि क्यों।std :: random_device क्यों हटाया गया है इसकी कॉपी कन्स्ट्रक्टर को परिभाषित करता है?

केवल टिप्पणी मैं docs से पाया जाता है:

2) प्रतिलिपि निर्माता हटा दी जाती है: std::random_device copyable नहीं है।

यह हटाए जाने के लिए एक स्पष्ट कारण प्रतीत नहीं होता है। इसके पीछे का कारण क्या है?

उत्तर

7

कारण है कि std::random_device copyable नहीं है यह है कि अगर यह थे, की नकल की उदाहरण वापस आ सकते हैं मूल रूप की तरह नंबर (यह परिभाषित कार्यान्वयन है, हालांकि)!

इसका कारण यह है (docs):

std::random_device एक कार्यान्वयन से परिभाषित छद्म यादृच्छिक संख्या इंजन के मामले में लागू किया जा सकता एक गैर नियतात्मक स्रोत (जैसे एक हार्डवेयर डिवाइस) उपलब्ध नहीं है, तो कार्यान्वयन के लिए। इस मामले में प्रत्येक std::random_device ऑब्जेक्ट समान संख्या अनुक्रम उत्पन्न कर सकता है।

कुछ कार्यान्वयन इस प्रकार एक पीआरएनजी लागू करेंगे। पीआरएनजी आमतौर पर बीज मूल्य (और कुछ अन्य राज्य) के साथ लागू होते हैं, जिससे "यादृच्छिक" संख्याएं उत्पन्न होती हैं। std::random_device की प्रतिलिपि बनाकर, यह किसी अन्य आंतरिक स्थिति के साथ बीज मान की प्रतिलिपि बनायेगा जो जनरेटर यादृच्छिक संख्या उत्पन्न करने के लिए उपयोग करता है (जिसे कार्यान्वित किया गया है)।

आप 2 यादृच्छिक उपकरणों, जो नियतात्मक हैं होता है क्योंकि वे एक ही नंबर अनुक्रम उत्पन्न:

std::random_device device1; 
std::random_device device2 = device1; //For demonstration purposes only 

std::uniform_int_distribution dis{ 0, 10 }; 

int randomNumber1 = dis(device1); 
int randomNumber2 = dis(device2); 
//Note that "randomNumber1 == randomNumber2"! They use exactly the same random number 
//generator with the same seed value, etc. -> Same numbers are generated! 

कार्यान्वयन हमेशा हर std::random_device के लिए एक ही बीज मूल्यों का उपयोग कर सकते हैं, मतलब होगा जो कि अलग-अलग यादृच्छिक उपकरणों के लिए हर बार एक ही संख्या अनुक्रम उत्पन्न होता है। या यह कुछ गैर नियतात्मक स्रोत (ऊपर से लिया गया) का उपयोग हो सकता है:

इस मामले में प्रत्येक std::random_device वस्तु एक ही नंबर अनुक्रम उत्पन्न हो सकता है।


[...] अगर एक गैर नियतात्मक स्रोत (जैसे एक हार्डवेयर डिवाइस) [...]

उन मामलों में यह बात नहीं है कि यादृच्छिक डिवाइस copyable है (कोई यह नहीं सोचता कि प्रतिलिपि वास्तव में एक प्रतिलिपि है), लेकिन यह है जहां कार्यान्वयन पीआरएनजी का उपयोग करते हुए विभिन्न यादृच्छिक उपकरणों के लिए अलग मान उत्पन्न करता है।

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

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

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