rand()
समारोह विशेष रूप से जब किसी दिए गए बीज के साथ वरीयता प्राप्त संख्या के उसी क्रम का निर्माण करने के लिए आवश्यक है (srand()
फोन करके) ; प्रत्येक संभावित बीज मूल्य अनुक्रम निर्दिष्ट करता है। और यदि आप कभी भी srand()
पर कॉल नहीं करते हैं, तो आपको पर किसी भी कॉल से पहले srand(1)
पर कॉल करके प्राप्त किया गया वही अनुक्रम मिलता है।
(यह अलग सी या सी ++ कार्यान्वयन भर में लागू नहीं होता।)
यह परीक्षण प्रयोजनों के लिए उपयोगी हो सकता है। यदि आपके प्रोग्राम में कोई बग है, उदाहरण के लिए, आप इसे उसी बीज के साथ फिर से चलाने के द्वारा पुन: उत्पन्न कर सकते हैं, यह गारंटी देते हुए कि (अन्य अप्रत्याशित व्यवहार को छोड़कर) आपको छद्म-यादृच्छिक संख्याओं का एक ही अनुक्रम मिलेगा।
कॉलिंग srand(time(NULL))
अधिक या कम अप्रत्याशित छद्म-यादृच्छिक संख्या प्राप्त करने के लिए सामान्य अनुशंसित तरीका है। लेकिन यह सही नहीं है। यदि आपका प्रोग्राम एक ही सेकंड में दो बार चलता है, तो आपको शायद वही अनुक्रम मिलेगा, क्योंकि time()
(आमतौर पर) में 1 सेकंड का संकल्प होता है। और ठेठ `रैंड() कार्यान्वयन क्रिप्टोग्राफिक उपयोग के लिए पर्याप्त नहीं हैं; हमलावर के अनुमान लगाना बहुत आसान है कि आप कौन सी संख्याएं प्राप्त करने जा रहे हैं।
कई अन्य यादृच्छिक संख्या कार्यान्वयन हैं। लिनक्स सिस्टम में दो छद्म-उपकरण हैं, /dev/random
और /dev/urandom
, जिसमें से आप उचित उच्च गुणवत्ता वाली छद्म-यादृच्छिक बाइट मान पढ़ सकते हैं।कुछ सिस्टम में random()
, drand48()
जैसे कार्य हो सकते हैं, और बहुत आगे। और कई एल्गोरिदम हैं; मैंने Mersenne Twister के बारे में अच्छी बातें सुनी हैं।
किसी गेम की तरह कुछ, जहां आप धोखा देने की कोशिश करने वाले खिलाड़ियों की अपेक्षा या देखभाल नहीं करते हैं, srand(time(NULL))
और rand()
शायद काफी अच्छा है। अधिक गंभीर उद्देश्यों के लिए, आपको किसी ऐसे व्यक्ति से सलाह लेनी चाहिए जो मेरे द्वारा किए गए सामानों के बारे में अधिक जानता है।
comp.lang.c FAQ की धारा 13 में छद्म-यादृच्छिक संख्या पीढ़ी के बारे में कुछ अच्छी जानकारी है।
स्रोत
2011-10-13 01:13:13
देखें http://en.wikipedia.org/wiki/Pseudorandom_number_generator – DuckMaestro