2011-01-19 19 views
9
srand(time(0)) 

सी ++ में प्रारंभिक मूल्य के साथ बीजिंग रैंड द्वारा यादृच्छिक संख्याओं की पीढ़ी में मदद करने के लिए उपयोग किया जाता है।srand (समय (0)) और यादृच्छिक संख्या पीढ़ी

लेकिन, क्या आप समझा सकते हैं कि यह वास्तव में क्या करता है?

धन्यवाद।

उत्तर

17

srand() यादृच्छिक कार्य को एक नया बीज देता है , एक शुरुआती बिंदु (आमतौर पर यादृच्छिक संख्याओं को पिछली संख्या (या बीज) ले कर गणना की जाती है और फिर उस संख्या पर अगले ऑपरेशन करने के लिए कई ऑपरेशन करते हैं)।

time(0) यूनिक्स युग के बाद से सेकंड में समय देता है, जो एक बहुत अच्छा "अप्रत्याशित" बीज है (आपको गारंटी है कि आपका बीज केवल एक ही होगा, जब तक कि आप एक ही सेकंड में अपना प्रोग्राम कई बार शुरू नहीं करते) ।

+1

चाहे यह "बहुत अच्छा अप्रत्याशित" है हमलावर के साधनों पर निर्भर करता है। यदि यह अनुमान लगाना संभव है कि यादृच्छिक संख्या उत्पन्न हुई थी, तो संभावित बीज मूल्यों की जगह बहुत कम हो सकती है। तो यह क्रिप्टोग्राफिक रूप से सुरक्षित यादृच्छिक संख्या उत्पन्न करने का एक तरीका नहीं है। लेकिन srand/rand इस के लिए उपयुक्त नहीं है ... – sleske

+0

जब आप कहते हैं: "समय (0) सेकंड में समय देता है ...", आपका मतलब क्या है? क्या आप सिर्फ आउटपुट का उदाहरण दे सकते हैं? धन्यवाद। – Simplicity

+0

यूनिक्स युग 1 जनवरी 1 9 70 00:00:00 है। 'समय (0) 'उस पल के बाद से पारित सेकंड की राशि देता है। – orlp

3

सी rand फ़ंक्शन बीज का उपयोग करके यादृच्छिक संख्या उत्पन्न करता है (बस सबसे अधिक - किसी भी? - छद्म-यादृच्छिक जनरेटर)।

srand यादृच्छिक जनरेटर एल्गोरिदम द्वारा उपयोग किए जाने वाले बीज को सेट करने के लिए उपयोग किया जाता है। time (यानी: वर्तमान दूसरा) द्वारा लौटाया जाने वाला मान आमतौर पर इस तरह के फ़ंक्शन को पास किया जाता है क्योंकि यह आमतौर पर एक आवेदन के दो निष्पादन के बीच अलग-अलग होता है जो

4

मुझे जो याद है, उससे एक समीकरण है जिसका उपयोग मूल्यों का अनुक्रम उत्पन्न करने के लिए किया जाता है। अगला मूल्य कुछ हद तक पिछले मूल्य से प्रभावित है। समय का उपयोग करके, आप समीकरण के प्रारंभिक मान को सेट कर रहे हैं। ध्यान रखें, मूल्य छद्म यादृच्छिक हैं।

इसलिए उदाहरण के लिए, यदि आप कुछ इस तरह करते हैं:

 

srand(1); 
srand(1); 
 

संख्या के उसी क्रम उत्पन्न हो जाएगा। हालांकि, यदि आप करते हैं:

 

srand(time(0)); 
srand(time(0) + 1); 
 

संख्याओं के दो अलग-अलग अनुक्रम बी उत्पन्न होंगे क्योंकि बीज मूल्य अलग है।

+0

@ user489041: केवल अगर आप करते हैं दो 'srand (समय (0)) 'उनके बीच में एक-दूसरे अंतर के साथ। –

+1

अंतिम उदाहरण में, वास्तव में अलग नहीं है जब तक कि दो 'srand' कॉल के बीच 1 सेकंड से अधिक न हो। यदि आपके पास आवेदन की शुरुआत में एक बार 'srand (समय (0)) है और आप इसे प्रति सेकंड कई बार चलाते हैं (उदाहरण के लिए कुछ स्क्रिप्टिंग दृष्टिकोण)। कभी-कभी आश्चर्यजनक हो सकता है। – Kos

+0

@ टोमालक गर्टकल @ कोस-सहमत, यह एक बुरा बग था जिसे मुझे एक बार खोजना पड़ा। उदाहरण में, लाइनें शायद एक सेकंड से अधिक तेज़ी से निष्पादित होंगी। अद्यतन उत्तर – user489041

2

एक article at Wikipedia है जो कुछ अच्छे इतिहास और उपयोग किए गए एल्गोरिदम के उदाहरण देता है।

लघु संस्करण यह है कि rand() और इसके जैसे छद्म यादृच्छिक संख्या जेनरेटर हैं। वास्तव में, वे वास्तव में निर्धारक — उत्पादित संख्याओं का अनुक्रम हमेशा समान होते हैं। हालांकि, अनुक्रम बहुत लंबा है, और बीजिंग तंत्र उस अनुक्रम में एक (अधिक या कम) मनमाने ढंग से स्थान शुरू करने का माध्यम प्रदान करता है।

यादृच्छिक संख्याओं का उपयोग कैसे किया जाएगा, इस पर निर्भर करता है कि छद्म यादृच्छिक जनरेटर की गुणवत्ता का मूल्यांकन करने के लिए विभिन्न मानदंड हैं। बहुत ही सरल परिस्थितियों में, संभवतः सभी की आवश्यकता है लगातार कॉल से दोहराए गए मूल्यों की कम संभावना rand() पर। हालांकि, आप चाहते हैं कि संख्याएं किसी विशेष सांख्यिकीय वितरण के अनुरूप हों। (जहां तक ​​मुझे पता है, अधिकांश पीआरएनजी समान रूप से वितरित संख्याएं उत्पन्न करते हैं। हालांकि विभिन्न कार्यों को आसानी से लिखा जा सकता है या इसे किसी अन्य भाषा में बदलने के लिए आसानी से लिखा जा सकता है।)

अंत में, जब सुरक्षा चिंता का विषय है, आप एक एल्गोरिदम चाहते हैं, सभी व्यावहारिक उद्देश्यों के लिए, अप्रत्याशित। यदि कोई हमलावर पहले जेनरेट किए गए नंबर को जानता है, तो उसे अगली उम्मीद करने में सक्षम नहीं होना चाहिए।बहुत उच्च सुरक्षा अनुप्रयोगों में, वास्तव में यादृच्छिक संख्या जनरेटर का उपयोग किया जा सकता है; ये यादृच्छिकता के विभिन्न बाहरी स्रोतों पर भरोसा करेंगे, जैसे रेडियो स्थिर, छवि कैप्चर डिवाइस (लेंस कैप ऑन) में थर्मल शोर, या ऐसे अन्य स्रोत। इसके अलावा, कई आधुनिक ऑपरेटिंग सिस्टम (लिनक्स समेत) अप्रत्याशित उपयोगकर्ता इंटरैक्शन जैसे विभिन्न स्रोतों से "एन्ट्रॉपी पूल" इकट्ठा करते हैं और स्टोर करते हैं और इससे यादृच्छिक संख्याओं के उत्पादन की अनुमति देते हैं।

छद्म यादृच्छिक जेनरेटर के साथ काम करने के लिए उपयोग नहीं किए जाने वाले लोगों की एक आम प्रोग्रामिंग त्रुटि rand() पर प्रत्येक कॉल से पहले फिर से बीज करना है। बेशक, यह अनावश्यक और शायद अवांछनीय है। केवल एक बार प्रत्येक जनरेटर बीज।

3

सबसे पहले, srand & rand के लिए/सी, सी ++ नहीं से, C++ 0x अपनी ही random number generator classes पेश कर रहा है है।

कि srand & rand अलावा कार्यान्वयन परिभाषित कर रहे हैं, वे केवल 0 और RAND_MAX के बीच एक यादृच्छिक देने की जरूरत है। windows पर यह एक मूल MWC16/32 है, जो बीजों को स्टोर करने के लिए टीएलएस का उपयोग करता है, srand उस बीज को सेट करता है, जिसका उपयोग rand द्वारा छद्म यादृच्छिक संख्या को रोल करने के लिए किया जाता है।

यादृच्छिक संख्या जनरेटर के माध्यम से इसकी सुंदर भयानक, विशेष रूप से विंडोज संस्करण।

+0

+1 सुरक्षा के बारे में अच्छा बिंदु। यह भी ध्यान रखें कि कम से कम आईएसओ सी RAND_MAX 32,768 जितना छोटा हो सकता है, इसलिए यह केवल यादृच्छिकता के 15 बिट प्रदान करता है, भले ही आप पूरी तरह से यादृच्छिक बीज का उपयोग करें ... – sleske

-2
#include "stdio.h" //rmv coding for srand is pure 
#include "conio.h" 
#include "time.h" 

void main() 
{ 

    time_t t; 

    srand(time(0)); 

    for (i = 1; i <= 10; i++) 
     cout << (unsigned) rand() % 1000 - 90 << "\t"; 

    for (i = 1; i <= 10; i++) 
     cout << (char) rand() % 100 - 90 << "\t"; 

    getch(); 

} 
+0

यह प्रश्न का उत्तर नहीं है, न ही यह मान्य है सी ++ कोड। –

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