c++ - Random number generator in a for loop gives same numbers each time -
इस सवाल का पहले से ही एक उत्तर है: < / p>
- 4 जवाब
यह प्रोग्राम कार्य करना माना जाता है स्पिन के लिए तीन अलग-अलग "पहियों" के साथ एक सुंदर आदिम स्लॉट मशीन के रूप में। प्रत्येक पहियों में वर्णों की एक निर्धारित राशि होती है एक फ़ंक्शन प्रत्येक पहिया में एक सरणी स्थिति के रूप में असाइन करने के लिए एक यादृच्छिक संख्या उत्पन्न करता है, जो तब उस स्थिति के अनुरूप एक प्रतीक उत्पन्न करता है।
मुझे जो समस्या आ रही है वह है कि बेतरतीब ढंग से जेनरेट की गई संख्या में परिवर्तन नहीं होता है लूप के लिए मेरे प्रत्येक चलना इसलिए मैं मूल रूप से हमेशा "X - X" या "X @ -" हर एक लूप-के माध्यम से प्राप्त कर रहा हूं। मैंने पहले पूछे जाने वाले प्रश्नों के माध्यम से तलाक लिया है और कई संबंधित लोगों को पाया है, लेकिन कोई भी मेरी विशेष समस्या को हल नहीं कर पाया।
लम्बी कोड के लिए क्षमा चाहते हैं:
#include & lt; iostream & gt; #include & lt; स्ट्रिंग & gt; # शामिल करें & lt; cstdlib & gt; # शामिल करें & lt; ctime & gt; नेमस्पेस एसटीडी का उपयोग करना; Const int WHEEL_POSITIONS = 30; कॉन्स्ट चार पहिया सिंबॉल्स [WHEEL_POSITIONS + 1] = "-X-X-X- एक्स-एक्स = एक्स = एक्स = एक्स * एक्स * एक्स * एक्स * एक्स @ X @ X7X"; स्ट्रक्चर्ड स्लॉटमैचिन {चार प्रतीकों [WHEEL_POSITIONS + 1]; Int spinPos; चार स्पिन सिंबोल; } पहियों [3]; शून्य प्रारंभ व्हाल (स्लॉटमैचीन []); शून्य स्पिन वाहेल्स (स्लॉटमैचीन []); शून्य प्रदर्शनप्रतिफल (स्लॉटमैचीन []); बूल मिल विजेता (स्लॉटमैचीन []); Int मुख्य (शून्य) {int spinNum; Cout & lt; & lt; "आप कितनी बार पहिया को स्पिन करना चाहते हैं?"; Cin & gt; & gt; spinNum; // कॉल शुरू होता है फ़ंक्शन शुरू व्हाउल्स (पहियों); के लिए (इंट आई = 0; आई & lt; spinNum; i ++) {// कॉल स्पिन वाहेल फ़ंक्शन स्पिन वॉल्स (पहियों); // कॉल डिस्प्लेप्रतिफल फ़ंक्शन डिस्प्लेप्रतिफल (पहियों); // कॉल फॉरमेट विवियर; अगर प्राप्तकर्ता सही है, तो जीतने वाला संदेश आउटपुट देता है यदि (getWinner (पहियों) == सच) {cout & lt; & lt; "विजेता, 3 का मिलान हुआ" & lt; & lt; पहियों [0]। स्पिन साइबोल & lt; & lt; "।" & Lt; & lt; endl; }} वापसी 0; } // पहिया स्कीमबॉल्स में संग्रहीत अक्षरों के लिए प्रत्येक पहिया को इनिशियलाइज़ करने के लिए कार्य [] शून्य प्रारंभ व्हाल (स्लॉटमैचीन फ़्वेल्स [3]) {के लिए (इंट आई = 0; आई & lt; 3; i ++) {के लिए (इंट जे = 0; जे एंड एलटी ; (WHEEL_POSITIONS + 1); J ++) {एफवल्स [आई]। सिंबॉस [जे] = पहिया साइम्बोल्स [जे]; }}} // प्रत्येक पहिया शून्य स्पिन वाहील्स में एक यादृच्छिक स्थिति उत्पन्न करने के लिए समारोह (स्लॉटमैचीन फ़्वेल्स [3]) {time_t बीज; समय (& amp; बीज); srand (बीज); के लिए (इंट आई = 0; आई & lt; 3; i ++) {एफवल्स [आई]। स्पिन पीस = (रैंड (%) WHEEL_POSITIONS); }} शून्य प्रदर्शन परिणाम (स्लॉटमैचीन फ़्वेल्स [3]) {के लिए (इंट आई = 0; आई & lt; 3; i ++) {एफवल्स [आई]। स्पिन सिंबॉल = एफवेल्स [आई]। सिंबॉल्स [[एफवल्स [आई]। स्पिन पीस]] ; Cout & lt; & lt; fwheels [i] .spinSymbol; } cout & lt; & lt; endl; } Bool getWinner (स्लॉटमैचिन फ्वेेल [3]) {यदि ((फ़्वेल्स [0]। स्पिनसंबोल == एफवहेल्स [1]। स्पिन साइबोल) और amp; एफवहेल्स [0]। स्पिन साइबोल == एफवेल्स [2]। स्पिन साइबोल) और ; & Amp; (फ़्वेल्स [1]। स्पिन साइबोल == फ़्वेल्स [2]। स्पिनसंबोल)) {सच; } अन्य {वापसी झूठी; }}
मुझे यकीन है कि यह कुछ आसान है कि मुझे याद आ रही है, लेकिन मैं इसे काफी नहीं ढूँढ सकता!
आप अपने यादृच्छिक संख्या जनरेटर को हर बार जब आप फ़ंक्शन
spinwheels पर कॉल करते हैं, फिर से सीडिंग कर रहे हैं।
इन तीन पंक्तियों को आपके
मुख्य फ़ंक्शन के ऊपर।
time_t बीज; समय (& amp; बीज); srand (बीज);
जब हम
रैंड () का उपयोग करते हुए यादृच्छिक संख्या उत्पन्न करते हैं, तो हम वास्तव में एक पीआरएनजी (पीआरएनजी) का उपयोग कर रहे हैं, जो एक यादृच्छिक दिखने वाले मानों का एक निश्चित क्रम बनाता है विशेष इनपुट को
बीज कहा जाता है जब हम बीज सेट करते हैं, तो हम एक ही बीज पर फिर से शुरू करने के लिए क्रम को प्रभावी ढंग से रीसेट कर रहे हैं।
आप सोच सकते हैं कि
समय का प्रयोग हर बार एक अलग बीज का होता है, जो हर बार आपको एक अलग परिणाम भी दे सकता है, लेकिन एक तेज़ कंप्यूटर प्रोग्राम में, बहुत कम समय पारित किया है कि बीज प्रत्येक कॉल के दौरान प्रभावी रूप से अपरिवर्तित है।
यही कारण है कि, जैसा कि अन्य जवाब में बताया गया है, आपको अपने कार्यक्रम में एक बार
srand () को कॉल करना चाहिए।
Comments
Post a Comment