2012-04-09 12 views
6

मैं निम्नलिखित कोड के बारे में एक प्रश्न है दे रही है:रैंड()% 4000000000UL केवल छोटे मान

#include <iostream> 
#include <ctime> 

int main(){ 
    unsigned long int blob; 
    srand(time(0)); 

    for(int counter = 0; counter <= 100; counter++) { 
     blob = rand() % 4000000000UL ; 
     std::cout << blob << std::endl; 
    }//for 
    system("pause"); 
    return 0; 
} //main 

यह codepad.org पर

378332591 
1798482639 
294846778 
1727237195 
62560192 
1257661042 

लेकिन विंडोज 7 64bits पर जैसे बड़े मूल्यों आउटपुट, यह केवल छोटे मान (परीक्षण किया VS11 पर & कोड :: ब्लाकों संकलन)

10989 
13493 
13169 
18581 
17972 
29 

adv में धन्यवाद आउटपुट सी ++ सीखने में मदद करने के लिए ऐस;)

उत्तर

9

रैंड() केवल आरएND_MAX तक ही संख्याएं उत्पन्न करता है।

MSDN के अनुसार, विंडोज RAND_MAX पर सिर्फ 32767 है, या (2 ** 15 - 1) (नोट करें कि यह सी मानक (यहाँ link to open group base spec, जो सी मानक) पर आधारित है के अनुसार कम से कम अनुमति RAND_MAX है)।

आप बड़ा संख्या चाहते हैं, आप इसे और अधिक समय और bitshift, उदा .:

long long int my_big_random = rand()^(rand() << 15)^((long long int) rand() << 30); 

(example on codepad) कॉल करने के लिए की जरूरत है।

5

आपके द्वारा सामना किए जा रहे व्यवहार पर दो सिस्टम पर RAND_MAX के मानों के कारण है।

windows 7 system पर, RAND_MAX 32767, जो कुछ भी पर्यावरण codepad में अपने कोड चलाता है की तुलना में काफी छोटा एक मूल्य है। क्योंकि इस की, बेतरतीब ढंग से उत्पन्न मूल्यों एक काफी छोटे सीमा में हैं।

4

विंडोज एक यादृच्छिक संख्या जनरेटर का उपयोग करता है जिसका अधिकतम मूल्य 32767 है। RAND_MAX के लिए मान देखें।

आप दो रैंड() कॉल के आउटपुट को चिपकाकर एक बड़ा यादृच्छिक संख्या बना सकते हैं।

big_rand = rand() << 15 | rand(); 

तुम भी इस तरह के रूप Boost.Random या C++11 एक अलग यादृच्छिक संख्या जनरेटर के लिए स्विच कर सकते हैं।

2

रैंड के परिणामों कार्यान्वयन निर्भर कर रहे हैं और केवल के रूप में उच्च के रूप में हो सकता है 32767 की गारंटी:

http://en.cppreference.com/w/cpp/numeric/random/RAND_MAX

तो जब आप अलग पुस्तकालय कार्यान्वयन के साथ विभिन्न प्रणालियों पर अपने कोड चलाने के लिए, आप विभिन्न परिणामों प्राप्त कर सकते हैं विंडोज केवल 32767 तक की संख्या लौटा रहा है, इसलिए आपको अपने कोड से छोटी संख्याएं मिलती हैं।

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