समस्या इसके अतिरिक्त है। rand()
का int
मान लौटाता है 0...RAND_MAX
। इसलिए, यदि आप उनमें से दो जोड़ते हैं, तो आप उठेंगे RAND_MAX * 2
। यदि यह अधिक हो जाता है INT_MAX
, तो अतिरिक्त सीमा का परिणाम एक सीमा से अधिक int
हो सकता है। हस्ताक्षरित मूल्यों का अतिप्रवाह अपरिभाषित व्यवहार है और इससे आपके कीबोर्ड को विदेशी भाषा में बात करने में परेशानी हो सकती है।
जैसा कि दो यादृच्छिक परिणामों को जोड़ने में यहाँ कोई लाभ नहीं है, सरल विचार सिर्फ यह नहीं करना है। वैकल्पिक रूप से आप प्रत्येक परिणाम को unsigned int
जोड़ सकते हैं इससे पहले कि अगर वह योग पकड़ सके। या एक बड़े प्रकार का उपयोग करें। ध्यान दें कि long
है जरूरी नहीं कि की तुलना में व्यापक int
है, वही पर लागू होता है long long
, तो int
कम से कम 64 बिट्स है!
निष्कर्ष: बस जोड़ से बचें। यह अधिक "यादृच्छिकता" प्रदान नहीं करता है। यदि आपको अधिक बिट्स की आवश्यकता है, तो आप मानों को संक्षिप्त कर सकते हैं sum = a + b * (RAND_MAX + 1)
, लेकिन यह भी संभावना है कि डेटा प्रकार की तुलना में अधिक की आवश्यकता हो int
।
जैसा कि आपका बताया गया कारण शून्य-परिणाम से बचना है: दो rand()
कॉल के परिणामों को जोड़कर टाला नहीं जा सकता , क्योंकि दोनों शून्य हो सकते हैं। इसके बजाय, आप सिर्फ वेतन वृद्धि कर सकते हैं। यदि RAND_MAX == INT_MAX
, ऐसा नहीं किया जा सकता है int
। हालांकि, (unsigned int)rand() + 1
बहुत, बहुत संभावना है। समान रूप से (निश्चित रूप से नहीं), क्योंकि इसकी आवश्यकता होती है UINT_MAX > INT_MAX
, जो उन सभी कार्यान्वयनों पर सच है जिनके बारे में मुझे पता है (जो कि पिछले कुछ वर्षों में काफी कुछ एम्बेडेड आर्किटेक्चर, डीएसपी और सभी डेस्कटॉप, मोबाइल और सर्वर प्लेटफॉर्म को कवर करता है)।
चेतावनी:
यद्यपि पहले से ही यहां टिप्पणियों में छिड़का हुआ है, कृपया ध्यान दें कि दो यादृच्छिक मूल्यों को जोड़ने से एक समान वितरण नहीं मिलता है, लेकिन एक त्रिकोणीय वितरण जैसे दो पासा रोलिंग: 12
(दो पासा) पाने के लिए दोनों पासा दिखाना होगा 6
। के लिए 11
पहले से ही दो संभावित रूप हैं: 6 + 5
या 5 + 6
, आदि।
तो, इस पहलू से भी जोड़ खराब है।
यह भी ध्यान दें कि परिणाम rand()
उत्पन्न एक दूसरे से स्वतंत्र नहीं हैं, क्योंकि वे एक छद्म आयामी संख्या जनरेटर द्वारा उत्पन्न होते हैं । यह भी ध्यान दें कि मानक गणना मूल्यों की गुणवत्ता या एक समान वितरण को निर्दिष्ट नहीं करता है।
rand()
नकारात्मक नहीं हो सकता ...