2009-09-29 3 views
5

ठीक है तो मैं एक पासा फेंक एप्लिकेशन है ...सी # कोड केवल चरण के माध्यम से अपेक्षित परिणाम देता है?

जब मैं कोड यह सामान्य रूप से काम करता है के माध्यम से कदम और 'परिणाम' फेंक परिणामों की सही संख्या में शामिल हैं और वे, यादृच्छिक होने के लिए जब मैं करने के लिए कोड छोड़ दिखाई दौड़ें और वही काम करें जो समान संख्याओं का एक सेट बनाता है।

मुझे यकीन है कि यह एक तार्किक त्रुटि है जिसे मैं नहीं देख सकता लेकिन घंटों के लिए इसके साथ झुकाव ने स्थिति में सुधार नहीं किया है, इसलिए किसी भी मदद की बहुत सराहना की जाती है। :)

class Dice 
{ 

    public int[] Roll(int _throws, int _sides, int _count) 
    { 
     Random rnd = new Random(); 
     int[] results = new int[_throws]; 
     // for each set of dice to throw pass data to calculate method 
     for (int i = 0; i < _throws; i++) 
     { 
      int thisThrow = Calculate(_sides, _count); 
      //add each throw to a new index of array... repeat for every throw 
      results[i] = thisThrow; 
     } 

     return results; 
    } 


    private int Calculate(int _sides, int _count) 
    { 
     Random rnd = new Random(); 
     int[] result = new int[_count]; 
     int total = 0; 
     //for each dice to throw put data into result 
     for (int i = 0; i < _count; i++) 
     { 
      result[i] = rnd.Next(1, _sides); 
     } 
     //count the values in result 
     for (int x = 0; x < _count; x++) 
     { 
      total = total + result[x]; 
     } 
     //return total of all dice to Roll method 
     return total; 
    } 
} 

उत्तर

12

पहले गलती: रैंडम के कई उदाहरण कभी उपयोग करते हैं, एक उदाहरण का उपयोग करें, और पारित है कि अन्य मानकों के साथ।

+0

धन्यवाद अब संशोधित :) – Yoda

+0

बहुत जल्दी ड्रा! –

+1

@ इयान: मैंने देखा है कि यह अक्सर कई बार होता है न कि इसे तुरंत स्पॉट करें :) – leppie

-1

निर्माता रैंडम को एक बीज दें। यही समस्या है।

http://msdn.microsoft.com/en-us/library/aa329890%28VS.71%29.aspx

Random r = new Random(DateTime.Now.Millisecond); 
+2

बीज के रूप में मिलीसेकंड का उपयोग करना टिक्स के डिफ़ॉल्ट से भी बदतर है। ज्यादातर मामलों में टिक बीज ठीक है जैसे कि दूसरों ने कहा है, रैंडम क्लास को फिर से बनाएं और फिर इसे उसी मूल्य पर दोबारा बीज दें। –

+0

आह। मैं सी-शैली रैंड कार्यों के लिए इतना उपयोग किया जाता है। –

5

जब आप "रैंडम आरएनडी = नया रैंडम();" बनाते हैं; यह वर्तमान समय से बीजित है। जब आप अपना कोड डीबग करते हैं (जिसमें समय लगता है) तो इसे हर बार अलग-अलग बीज किया जाएगा।

रैंडम का 1 उदाहरण बनाएं, और संदर्भ हर जगह।

1

हर बार जब आप कोई संख्या बनाने की आवश्यकता होती है तो आप यादृच्छिक कक्षा बना रहे हैं। ऐसा करने से आपको नट परिणाम मिलेंगे।

यहाँ देखें: FROM MSDN

यह समस्या कई लोगों बजाय एक एकल रैंडम वस्तु बनाने से बचा जा सकता।

प्रदर्शन में सुधार करने के लिए, यादृच्छिक संख्या उत्पन्न करने के लिए बार-बार एक नई यादृच्छिक वस्तुओं को बनाने के बजाय, कई यादृच्छिक संख्याएं उत्पन्न करने के लिए एक यादृच्छिक वस्तु बनाएं।

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

1

से पहले क्या उल्लेख किया गया है के अलावा ...

उपयोग रैंडम। यदि आपको कभी भी सुरक्षा के लिए यादृच्छिक संख्या बनाने की आवश्यकता है, तो System.Security.Cryptography.RandomNumberGenerator का उपयोग करें। यह सरल उदाहरण एक यादृच्छिक पूर्णांक बनाने से पता चलता है।

 RandomNumberGenerator gen = RandomNumberGenerator.Create(); 
     byte[] myBytes = new byte[4]; 
     gen.GetBytes(myBytes); 
     int myValue = (BitConverter.ToInt32(myBytes, 0)); 

इसका उपयोग तब तक न करें जब तक आपको सुरक्षा की आवश्यकता न हो। प्रदर्शन रैंडम क्लास की तुलना में कम है। मुझे लगता है कि आप बीज रैंडम के लिए इसका इस्तेमाल कर सकते हैं लेकिन यह अधिक हो सकता है।

संपादित करें: यह मेरे लिए हुआ कि मैंने कभी इसका परीक्षण नहीं किया था।

1,000,000 यादृच्छिक संख्या: RandomNumberGenerator: 2.6 सेकंड रैंडम: 0.015 सेकंड एक त्वरित प्रदर्शन परीक्षण निम्नलिखित दिखाया।

तो रैंडम लगभग 150 गुना तेज है।

+2

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

+1

दूसरा, क्रिप्टो-शक्ति आरएनजी का प्रदर्शन न केवल गणित पर किया जाता है, बल्कि मशीन को चलाने के लिए आरएनजी के लिए * एन्ट्रॉपी * प्रदान करने की क्षमता पर भी गेट किया जाता है। आरएनजी कुछ भी नहीं से एंट्रॉपी का आविष्कार नहीं करता है, आपको पता है! उस एन्ट्रॉपी को कहीं से आना है, और एंट्रॉपी हर तरह के संसाधन के रूप में सीमित है, कहें, बैंडविड्थ, मेमोरी या प्रोसेसर समय। आप केवल प्रति सेकंड इतना एंट्रॉपी प्राप्त करते हैं; प्रोसेसर या नेटवर्क बैंडविड्थ ब्लॉक का उपयोग करने के प्रयास के रूप में, अधिक एंट्रॉपी उपलब्ध होने तक, बड़ी मात्रा में एन्ट्रॉपी का उपयोग करने का प्रयास निश्चित रूप से ब्लॉक होगा। –

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