धारा 26.5.1.1 पैरा सी ++ 11 मानक (N3242) की 1 का कहना है:सी ++ 11 यादृच्छिक संख्या जनरेटर UIntType विरोधाभास
इस उपखंड 26.5 दौरान एक टेम्पलेट instantiating का प्रभाव:
[...]
च) एक टेम्पलेट प्रकार
UIntType
नामित पैरामीटर है कि अपरिभाषित जब तक इसी टेम्पलेट तर्क सीवी-अयोग्य है औरunsigned short
में से एक,unsigned int
है, 0,123,, याunsigned long long
।
और यह 26.5.3.1 में रैखिक संगत जनरेटर को परिभाषित करता है। वर्ग की परिभाषा इस तरह शुरू होता है:
template<class UIntType, UIntType a, UIntType c, UIntType m>
class linear_congruential_engine
minstd_rand0
इस प्रतिबंध का उल्लंघन लगता है:
typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647>
minstd_rand0;
यह uint_fast32_t का उपयोग करता है के रूप में (जो unsigned short
में से एक, unsigned int
, unsigned long
होने की गारंटी नहीं है, या unsigned long long
) minstd_rand0
में UIntType
नामक टेम्पलेट पैरामीटर के लिए, ऐसा लगता है कि #include <random>
पर कम से कम प्रभाव पड़ता है, या कम से कम minstd_rand0
का उपयोग करने के लिए। यह समस्या अन्य पूर्वनिर्धारित आरएनजी पर भी लागू होती है, और यह C++ 14 में ठीक नहीं लगती है।
मेरे प्रश्न हैं:
- यह वास्तव में एक विरोधाभास (या बल्कि अपरिभाषित व्यवहार का एक चरम राशि) है, या मैं कुछ याद है?
- क्या इसका दोष दोष रिपोर्ट में उल्लेख किया गया है?
संपादित करें: मैं देखा है कि this दोष रिपोर्ट इस समस्या से संबंधित जा रहा है।
ठीक है, * आवश्यक व्यवहार * खंड जो तुरंत इसका पालन करता है, तर्कसंगत रूप से इस तरह की चीज को अच्छी तरह परिभाषित करने की आवश्यकता है। भले ही, क्या कोई वास्तविक प्रणाली है जिसमें 'uint_fast32_t' * उन प्रकारों में से एक नहीं है? –
@ टी.सी. मुझे लगता है कि यह हो सकता है, लेकिन मुझे लगता है कि यह केवल 10000 वें आमंत्रण को सही होने की आवश्यकता है। 10001 वें आमंत्रण अभी भी एक समस्या का कारण बन सकता है (या उस मामले के लिए, एक इंजन जो डिफ़ॉल्ट रूप से निर्मित नहीं था)। – qbt937
@ टी.सी. एमएसवीसी 'unintigned __int32't' का उपयोग करके' uint_fast32_t' को परिभाषित कर सकता है (मुझे नहीं पता कि मैं एमएसवीसी का उपयोग नहीं करता)। मैं मानता हूं कि यह प्रश्न अकादमिक है हालांकि। – qbt937