2011-10-13 19 views
20

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

मैं

#include <cstdlib> 

है और यादृच्छिक संख्या उत्पन्न करने के लिए इस का उपयोग कर रहा

randomDiceRollComputer = 1 + rand() % 6; 
+0

देखें http://en.wikipedia.org/wiki/Pseudorandom_number_generator – DuckMaestro

उत्तर

26

आप अपने यादृच्छिक संख्या जनरेटर बीज की जरूरत है:

की शुरुआत में इस डाल प्रयास करें कार्यक्रम:

srand (time(NULL)); 

ध्यान दें कि आपको #include <ctime> की आवश्यकता होगी।

यहां विचार यह है कि जब भी आप प्रोग्राम लॉन्च करते हैं तो आरएनजी को अलग-अलग नंबर के साथ बीज करना होता है। बीज के रूप में समय का उपयोग करके, जब भी आप प्रोग्राम लॉन्च करते हैं तो आपको एक अलग संख्या मिलती है।

+0

हम्म बीजिंग के मामले में इसका क्या अर्थ है? – mystycs

+4

असल में, आरएनजी वास्तव में यादृच्छिक नहीं हैं। वे एक सूत्र का उपयोग करते हैं जो प्रतीत होता है (छद्म) यादृच्छिक संख्या उत्पन्न करता है। और इस तरह उन्हें एक अनुक्रम उत्पन्न करने के लिए "प्रारंभ बिंदु" की आवश्यकता होती है। यदि आप बीज नहीं करते हैं, तो यह एक ही डिफ़ॉल्ट बीज का उपयोग करेगा और हर बार एक ही अनुक्रम उत्पन्न करेगा। – Mysticial

+2

बेहतर परिणामों के लिए, 'srand' के बाद एक बार 'रैंड' पर कॉल करें और वापसी मूल्य को फेंक दें। यह पता चला है कि इसी तरह के बीज एक समान पहले मूल्य उत्पन्न करते हैं, लेकिन यह तेजी से अलग हो जाता है। –

7

आपको रैंडम संख्या जनरेटर को एक बीज देने की आवश्यकता है। यह वर्तमान समय ले कर किया जा सकता है, क्योंकि यह उम्मीद है कि कुछ प्रकार की यादृच्छिक है।

#include <cstdlib> 
#include <ctime> 
using namespace std; 

int main() 
{ 
    int r; 
    srand(time(0)); 
    r = rand(); 
    return 0; 
} 
0

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

वैसे भी, कोड आप जैसे अन्य लोगों ने कहा है की तलाश कर रहे है:

srand(time(0)); //Seed the generator, give it a starting value 
+0

नहीं, वे ' छद्म यादृच्छिक कहा जाता है क्योंकि वे गणितीय अर्थ में वास्तव में यादृच्छिक नहीं हैं, केवल एक अनुमान है। एक पीआरएनजी जो प्रत्येक बार चलाने के लिए अलग-अलग संख्या उत्पन्न करता है वह अभी भी छद्म यादृच्छिक है। –

+0

@ किथ थॉम्पसन मुझे पता है, मेरा मतलब था कि यही कारण है कि इस विशिष्ट प्रकार का पीआरएनजी एक पीआरएनजी है। अधिक आम तौर पर एक पीआरएनजी छद्म यादृच्छिक के रूप में जाना जाता है, क्योंकि यह अनुक्रम के प्रत्येक मान को खोजने के लिए एक निर्धारक एल्गोरिदम का उपयोग करता है, सही? – jgon

1

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 में छद्म-यादृच्छिक संख्या पीढ़ी के बारे में कुछ अच्छी जानकारी है।

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