2015-03-19 11 views
12

मैं सी ++ में यादृच्छिक संख्या प्राप्त करने की कोशिश कर रहा हूं और मैं rand() का उपयोग कर रहा हूं। यह वही है cpplint कहते है:क्या मुझे रैंड() या rand_s() का उपयोग करना चाहिए?

rand(...) बजाय rand_r(...) का उपयोग कर बेहतर धागा सुरक्षा के लिए विचार करें।

मैं rand_r का उपयोग करने जा रहा हूँ और यह है कि क्या cppcheck कहते है:

अप्रचलित समारोह 'rand_r' कहा जाता है। इसके बजाय फ़ंक्शन 'रैंड' का उपयोग करने की अनुशंसा की जाती है।

कौन सही है?

+5

यदि संभव हो, तो "नई" ' 'सुविधाओं का उपयोग करें। 'रैंड' बहुत खराब है। [दिलचस्प] (http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful)। –

उत्तर

11

दोनों तरह की।

rand() समारोह सी मानक द्वारा परिभाषित किया गया है, और 1989/1990 में इस तरह की पहली मानक के बाद से किया गया है; इसे सी ++ मानक में संदर्भ द्वारा शामिल किया गया है। चूंकि rand() राज्य पर निर्भर करता है, यह धागा-सुरक्षित नहीं है।

rand_r() फ़ंक्शन को rand() पर थ्रेड-सुरक्षित विकल्प के रूप में डिज़ाइन किया गया था। यह आईएसओ सी या सी ++ मानक द्वारा परिभाषित नहीं है। इसे POSIX.1-2001 द्वारा परिभाषित किया गया था, लेकिन POSIX.1-2008 द्वारा अप्रचलित के रूप में चिह्नित किया गया (जिसका अर्थ है कि यह अभी भी POSIX मानक द्वारा परिभाषित किया गया है, लेकिन इसे भविष्य के संस्करण में हटाया जा सकता है)।

rand() के कार्यान्वयन, और इसलिए rand_r(), कम गुणवत्ता वाले हो सकते हैं। बहुत बेहतर छद्म यादृच्छिक संख्या जेनरेटर हैं। सी ++ के लिए, <random> लाइब्रेरी सी ++ 11 में जोड़ा गया था, और कई अलग-अलग विकल्प प्रदान करता है।

यदि आप चाहते हैं अधिकतम पोर्टेबिलिटी और आप गुणवत्ता या उत्पन्न संख्या और धागे की सुरक्षा का पूर्वानुमान बारे में बहुत ज्यादा परवाह नहीं है, चिंता का विषय नहीं है आप srand() और rand() उपयोग कर सकते हैं। अन्यथा, यदि आपके पास C++ 11 कार्यान्वयन उपलब्ध है, तो <random> शीर्षलेख में परिभाषित सुविधाओं का उपयोग करें। अन्यथा, अन्य छद्म-यादृच्छिक संख्या जनरेटर के लिए अपने सिस्टम के दस्तावेज़ों से परामर्श लें।

संदर्भ: POSIX, <random> on cppreference.com। के सी ++ 11 <random> से

+0

यह ध्यान देने योग्य हो सकता है कि सी ++ 11 का यादृच्छिक उन लोगों के लिए बूस्ट में मौजूद है जो सी ++ 11 का उपयोग नहीं कर सकते हैं लेकिन बूस्ट का उपयोग कर सकते हैं। – Morwenn

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