2012-12-12 11 views
5

संभव डुप्लिकेट:
Random number generator only generating one random numberकोड डीबगर के साथ कदम उठाने पर ही सही ढंग से चलता है?

मैं थोड़ा इस कुछ ही क्षणों पहले से विस्मित कर दिया गया था।

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 
    int makeBlockOfType = random.Next(0, 100); 

    blockType t = blockType.normal; 
    if (makeBlockOfType <= 80 && makeBlockOfType >= 60) 
    { 
     t = blockType.blue; 
    } 
    else if (makeBlockOfType > 80 && makeBlockOfType <= 95) 
    { 
     t = blockType.orange; 
    } 
    else if (makeBlockOfType > 95 && makeBlockOfType <= 100) 
    { 
     t = blockType.green; 
    } 

    return t; 
} 

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

इसके लिए मैं मोनोगेम का उपयोग कर रहा हूं जो माइक्रोसॉफ्ट के बजाय मोनो कंपाइलर का उपयोग करता है। क्या यह समस्या हो सकती है? मैंने इस कोड को कन्स्ट्रक्टर में डालने की कोशिश की है जहां से इसे कहा जा रहा है, लेकिन मुझे एक ही परिणाम मिल रहा है (मुझे लगता है कि कंपाइलर कोड को किसी भी तरह से रेखांकित करता है)।

मैंने विजुअल स्टूडियो को इसे चलाने के बजाए अलग-अलग दृश्य स्टूडियो को फिर से शुरू करने का प्रयास किया है; कोई बदलाव नहीं।

कोई भी सुझाव और सहायता की बहुत सराहना की जाती है!

+1

कोशिश, कि मदद करनी चाहिए। –

+0

'नया रैंडम()' बीज का उपयोग कर बीज, जो कई मिलीसेकंड के लिए स्थिर रहता है। – CodesInChaos

+0

डीबग में काम करने का कारण यह है कि कॉल के बीच समय है और रैंडम वास्तव में अलग-अलग बीज प्राप्त करता है। – Archy

उत्तर

3

जब आप Random के कई उदाहरणों को लगातार बहुत ही कम समय में बनाते हैं, तो वे एक ही समय-निर्भर बीज मूल्य के साथ आरंभ करने की संभावना समाप्त कर सकते हैं।

इस हल करने के लिए, आप के बजाय एक उदाहरण क्षेत्र के रूप में अपने Random प्रारंभ करना चाहिए:

private readonly Random random = new Random(); 

public blockType generateRandomBlock() 
{ 
    int makeBlockOfType = random.Next(0, 100); 

    // ... 
} 
7

आप केवल एक बार (एक निजी क्षेत्र और निर्माता में instanciate के रूप में सेट) रैंडम instanciate चाहिए, इसी तरह देखना प्रश्न: एक बीज मूल्य से

यादृच्छिक संख्या पीढ़ी शुरू होता है: Random.Next returns always the same values

Random documentation देखें। एक ही बीज बार-बार इस्तेमाल किया जाता है, संख्या का एक ही श्रृंखला

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

4

आप अपने यादृच्छिक संख्या जनरेटर पुनः कर रहे हैं हर बार जब आप अपने विधि कॉल:

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 

यादृच्छिक संख्या जनरेटर के बीज के रूप में समय यह लगातार कॉल के लिए समान मान प्रदान करेंगे पर आधारित है।

दिनचर्या के बाहर जनरेटर की अपनी रचना में स्थानांतरित करें: विधि से बाहर रैंडम निर्माण स्थानांतरित करने के लिए

Random random = new Random(); 
public blockType generateRandomBlock() 
{ 
संबंधित मुद्दे