2009-11-23 14 views
7

जब भी मैं यह कोड चलाता हूं, मुझे एक ही परिणाम मिलता है।हर बार जब मैं संकलित और चलाता हूं तो मुझे रैंड() के साथ एक ही परिणाम क्यों मिलता है?

कार्यक्रम

#include<stdlib.h> 

int main(int agrc, const char *argv[]) { 
int i = rand(); 
printf("%d\n",i); 
for(i=0;i<10;i++) { 
    printf("%d\n",rand()); 
} 
} 

परिणाम:

41 
18467 
6334 
26500 
19169 
15724 
11478 
29358 
26962 
24464 
5705 

मैं mingw पर इस भाग गया। असल में मैं सीख रहा हूं Objective-C

कृपया मेरी मदद करें।

+5

अनिवार्य xkcd संदर्भ: http://xkcd.com/221/ – Skizz

+0

http://stackoverflow.com/questions/1694827/random-float-number-help – Lucas

+1

व्यक्तिगत रूप से, मैं पहली बार यादृच्छिक संख्या का एक समूह को आकर्षित करना चाहते random.org से सुबह की बात है ताकि जब मुझे वास्तव में एक अच्छी यादृच्छिक संख्या की आवश्यकता हो तो मुझे कुछ हाथ मिल गया है। मुझे GUID के साथ भी ऐसा करना पसंद है। – Skizz

उत्तर

34

इसे इस्तेमाल करने से पहले आपको एक अद्वितीय संख्या के साथ रैंड फ़ंक्शन को बीज करने की आवश्यकता है। सबसे आसान तरीका time()

उपयोग करने के लिए उदाहरण

srand(time(NULL)); 
rand();//now returns a random number 

कारण है कि यादृच्छिक रैंड द्वारा प्रदान की संख्या() (या किसी अन्य एल्गोरिथ्म आधारित समारोह) यादृच्छिक नहीं हैं के लिए है। रैंड फ़ंक्शन केवल वर्तमान संख्यात्मक स्थिति लेता है, एक परिवर्तन लागू करता है, परिवर्तन के परिणाम को नए राज्य के रूप में बचाता है और नया राज्य देता है।

तो विभिन्न छद्म यादृच्छिक संख्याओं को वापस करने के लिए रैंड प्राप्त करने के लिए, आपको सबसे पहले रैंड() को कुछ अद्वितीय करने के लिए सेट करना होगा।

+9

इस उत्तर में जोड़ने के लिए: इस मामले में प्रत्येक बीज संख्या (समय()) यादृच्छिक संख्याओं की एक अलग सूची बना देगा। लेकिन, यदि बीज # वही है, तो सूची वही होगी। – Poindexter

+6

फ़ंक्शन 'टाइम'' टाइम_टी' ऑब्जेक्ट में पॉइंटर लेता है। करो 'srand (समय (एनयूएलएल));' इसके बजाए। और ध्यान रखें कि एक ही सेकंड के भीतर 'समय (NULL)' के लिए कई कॉल सभी एक ही मूल्य लौटाते हैं। – pmg

3

बस Yacoby के जवाब में जोड़ने के लिए - मैं थोड़ा हैरान है कि यह एक समय आधारित बीज के लिए डिफ़ॉल्ट नहीं किया था, इसलिए मैं man page देखा:

कोई बीज मूल्य प्रदान की जाती है, तो रैंड() फ़ंक्शन स्वचालित रूप से 1.

एक मूल्य के साथ वरीयता प्राप्त है तो अगर आप seed(1) उपयोग करने के लिए आप अभी भी एक ही आउटपुट देखना चाहिए अपने कोड बदलने - लेकिन seed(time()) हर बार बदल कर देगा।

+2

यह एक निश्चित बीज के लिए डिफ़ॉल्ट है ताकि यदि आवश्यक हो, तो आप अपने प्रोग्राम (ओं) से पुन: उत्पन्न परिणाम प्राप्त कर सकते हैं (उदाहरण के लिए परीक्षण, डिबगिंग, yaddah, yaddah के दौरान)। उस कॉलिंग srand (समय (NULL)) को जोड़ने के लिए –

2

रैंड से उत्पादन जिसका अर्थ है कि यह प्रभावी रूप से यादृच्छिक है, लेकिन उसी तरह हर बार की जाती है, एक विशेष मूल्य से शुरू बीज कहा जाता छद्म -random है। उसी बीज मूल्य के साथ, आपको यादृच्छिक संख्याओं का एक ही अनुक्रम मिलता है।

एक अलग बीज सेट करने के लिए, यादृच्छिक संख्याएं उत्पन्न करने से पहले मानक सी फ़ंक्शन शून्य srand (unsigned int) का उपयोग करें। प्रत्येक बार जब आप प्रोग्राम चलाते हैं तो यादृच्छिक संख्याओं का एक अलग अनुक्रम प्राप्त करने का एक आम तरीका घड़ी के समय बीज को आधार देना है। जैसे srand (घड़ी())

8

आप पीआरएनजी शुरू करना चाहते हैं।

srand() फ़ंक्शन की कॉल के साथ प्रारंभ यह एक बार (आमतौर पर main() अंदर)।

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

srand(1); /* same as default */ 
srand(42); /* no gain, compared to the line above */ 

आपको प्रोग्राम के प्रत्येक भाग के साथ बदलते मूल्य के साथ प्रारंभ करने की आवश्यकता है। time() फ़ंक्शन से लौटाया गया मान अक्सर उपयोग किया जाने वाला मान होता है।

srand(time(NULL)); /* different pseudo random numbers almost every run */ 

time(NULL) के साथ समस्या यह है कि यह एक ही दूसरे पर एक ही मान देता है। इसलिए, यदि आप उसी दिन 11:35:17 पर दो बार अपने प्रोग्राम को कॉल करते हैं तो आपको वही छद्म यादृच्छिक संख्या मिल जाएगी।

+1

+1 एक ही सेकंड में कई बार एक ही परिणाम देगा। –

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

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