2013-02-27 316 views
19

मैं समझता हूँ कि rand() समारोह छद्म यादृच्छिक बीज के आधार पर संख्या यह दिया जाता है उत्पन्न करता है, और है कि किसी भी मंच पर यह हमेशा एक ही बीज से संख्याओं का उसी क्रम उत्पन्न होगा, यह क्यों देता है क्या मैं जानना चाहता हूँ है एक ही पुस्तकालय का उपयोग करने वाले प्लेटफार्मों में एक अलग अनुक्रम? अर्थात। rand() कैसे लागू किया गया है?सी ++ stdlib रैंड() फ़ंक्शन प्लेटफ़ॉर्म पर उसी बीज के लिए अलग-अलग मान क्यों देता है?

+8

क्योंकि 'rand' के विनिर्देश अनुक्रम द्वारा उत्पादित मूल्यों यह तय नहीं होता। [] का उपयोग करें (http: //en.cppreference।कॉम/डब्ल्यू/सीपीपी/न्यूमेरिक/यादृच्छिक) यदि आप अनुक्रमों के बारे में गारंटी चाहते हैं। –

+3

मानक अनुक्रम निर्दिष्ट नहीं करता है, या छद्म यादृच्छिक संख्या अनुक्रम कैसे उत्पन्न होता है। इसलिए इन दो पहलुओं से संबंधित प्लेटफार्मों में कार्यान्वयन या व्यवहार के संबंध में कोई प्रतिबंध नहीं है। सी ++ 11 जोड़ता है [अधिक विनिर्देशों के साथ यादृच्छिक संख्या जेनरेटर] (http://en.cppreference.com/w/cpp/numeric/random)। – juanchopanza

+0

ठीक है, मैंने मानक की जांच की और ध्यान दिया कि अनुक्रम के बारे में कुछ भी निर्दिष्ट नहीं है, इसलिए कार्यान्वयन किस कारकों पर निर्भर करता है? क्या यह ओएस तक छोड़ा गया है? – Einherji

उत्तर

21

सी ++ मानक क्या एल्गोरिथ्म रैंड() फ़ंक्शन के लिए प्रयोग किया जाता है निर्दिष्ट नहीं है। माइक्रोसॉफ्ट के लिए मानक पुस्तकालय दृश्य स्टूडियो, और मानक पुस्तकालय जीसीसी के साथ पैक के लिए जीएनयू लोगों के साथ शामिल थे:

कार्यक्षमता जो कोई भी अपने सिस्टम पर मानक पुस्तकालय लिखा द्वारा परिभाषित किया गया है।

आपका संकलक कहाँ से अपने पुस्तकालय हो जाता है की पसंद बना रही है, तो आप एक ही सिस्टम पर विभिन्न compilers के लिए मानक पुस्तकालय के विभिन्न संस्करणों हो सकता है। बिंदु वही रहता है: विनिर्देश गारंटी देता है कि कौन से फ़ंक्शन उपलब्ध हैं और वे क्या करते हैं; वे यह कैसे नहीं करते हैं।

+0

क्या इसका मतलब है कि विंडोज़ पर जीएनयू कंपाइलर चलाने से वही अनुक्रम होगा? –

+0

@OmarKooheji मैंने वास्तव में विंडोज़ पर जीसीसी स्थापित करने की कोशिश नहीं की है। मेरा मानना ​​है कि जीसीसी, स्थापित होने पर, मानक लाइब्रेरी (संभवतः पूर्व संकलित) की अपनी प्रति के साथ आता है। मुझे नहीं पता कि कुछ निश्चित रूप से - किसी ऐसे व्यक्ति के लिए जो विंडोज पीसी तक पहुंच के साथ है, वह सामान को इंस्टॉल कर सकता है, यदि सही हो तो मेरा जवाब अपडेट करने के लिए स्वतंत्र महसूस होना चाहिए। – KidneyChris

+1

@ ओमारकुहेजी मैं उत्सुक था, इसलिए मैंने जांच की। मेरे उत्तर को थोड़ा और सटीक होने के लिए अपडेट किया गया है (भविष्य में टिप्पणी थ्रेड का पालन करने वाले लोगों के लाभ के लिए: मैंने मूल रूप से लाइब्रेरी को आपके देव पर्यावरण के बजाए ओएस में जिम्मेदार ठहराया) – KidneyChris

7

रैंड() फ़ंक्शन रेंज [0, {RAND_MAX}] कम से कम 2^32 की अवधि के साथ में छद्म यादृच्छिक पूर्णांकों का एक अनुक्रम की गणना करेगा।

rand_r() फ़ंक्शन रेंज [0, {RAND_MAX}] में छद्म-यादृच्छिक पूर्णांक के अनुक्रम की गणना करेगा। ({} RAND_MAX मैक्रो का मूल्य होगी कम से कम 32767.)

rand_r() वस्तु बीज द्वारा की ओर इशारा करने के लिए एक ही प्रारंभिक मूल्य के साथ कहा जाता है और उस वस्तु लगातार रिटर्न के बीच संशोधित नहीं किया गया है और rand_r() को कॉल करता है, वही अनुक्रम उत्पन्न किया जाएगा।

srand() फ़ंक्शन छद्म-यादृच्छिक संख्याओं के एक नए अनुक्रम के लिए बीज के रूप में तर्क का उपयोग करता है ताकि बाद में कॉल रैंड() तक लौटाया जा सके। यदि srand() को उसी बीज मान के साथ बुलाया जाता है, तो छद्म-यादृच्छिक संख्याओं का अनुक्रम दोहराया जाएगा। रैंड()() बना रहे हैं इससे पहले कि किसी भी कॉल कहा जाता है srand के लिए, उसी क्रम जब srand() पहले की 1.

एक बीज मूल्य रैंड साथ कहा जाता है के रूप में उत्पन्न किया जाएगा() फ़ंक्शन लौटा देगा अनुक्रम में अगला छद्म-यादृच्छिक संख्या।

यह है कि आईईईई स्टडी 1003.1 सी-मानक यह कहता है कि rand() फ़ंक्शन का व्यवहार कैसे करना चाहिए। अनुक्रम की गणना कैसे की जानी चाहिए इसके बारे में कुछ भी नहीं कहता है। दूसरे शब्दों में, प्रत्येक कार्यान्वयन एक छद्म यादृच्छिक क्रम जनरेटर का अपना संस्करण चुनने के लिए स्वतंत्र है।

आपका टिप्पणियों से पता चलता है कि वे स्वतंत्रता का लाभ ले लिया है।

मैं यह भी कहना है कि हो सकता है rand()<cstdlib> जो अधिक या है का एक हिस्सा है कम सी मानक पुस्तकालय की एक प्रति, और नए पुस्तकालय और अधिक लचीलापन और मानक अनुक्रम जनरेटर के साथ प्रदान करेगा यदि आप एक नया है पर्याप्त सी ++ कंपाइलर और सी - सी ++ इंटरऑपरेबिलिटी पर निर्भर नहीं है।

+0

'रैंड' सी ++ का हिस्सा भी है लाइब्रेरी, भले ही मानक के कुछ हिस्सों को सी मानक के संदर्भ में परिभाषित किया गया हो। –

+0

@phresnel, सच है, यह पूरा हो गया क्योंकि यह सी ++ का हिस्सा नहीं था। मैंने अपना जवाब संपादित करने के लिए अपना जवाब संपादित किया है। – daramarak

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

  • कोई संबंधित समस्या नहीं^_^