2011-10-29 11 views
6

में निपटान नहीं कर रहा है मैं सी # में एक चिकनी इलाके पीढ़ी एल्गोरिदम पर काम कर रहा हूं और डेटा प्रदर्शित करने के लिए एक्सएनए का उपयोग कर रहा हूं।रैंडम ऑब्जेक्ट सी #

मैं इसे बना रहा हूं, इसलिए यह दो बिंदुओं के बीच एक यादृच्छिक ऊंचाई पर प्रति बिंदु प्रत्येक बिंदु के बीच आधा रास्ते बनाता है। यह ठीक काम करता है, और मैंने इसे सेट किया है ताकि दूसरे पुनरावृत्ति पर यह एक ही अक्ष पर मौजूद बिंदुओं के बीच एक नया बिंदु बनाने की बजाय स्लाइड दो की तरह एक यादृच्छिक बिंदु चुनता है।

क्या हो रहा है कि पाश पिछले यात्रा से एक ही यादृच्छिक मान उपयोग कर रहा है: http://i.stack.imgur.com/UmWr7.png

यह नहीं आदर्श जाहिर है, के रूप में यह एक उचित यादृच्छिक पीढ़ी नहीं है।

अगर मैं प्रत्येक बिंदु पीढ़ी के बाद एक Thread.Sleep(20) का उपयोग इसे सही ढंग से काम करता है: http://i.stack.imgur.com/KziOg.png

मैं Sleep वैकल्पिक हल यदि संभव हो तो उपयोग करने के लिए के रूप में यह बहुत धीमी है नहीं करना चाहते हैं, और मैं इस का उपयोग करना चाहेंगे रियल टाइम। मुझे यकीन है कि सी # कचरा कलेक्टर के साथ इसका कुछ संबंध है।

यहाँ मेरी प्राप्त प्वाइंट कोड

Random r = new Random(); 
int x = (p1.X + p2.X)/2; 
int y; 
if (!initial) 
     y = r.Next(Math.Min(p1.Y, p2.Y), Math.Max(p1.Y, p2.Y)); 
else 
     y = r.Next(Math.Min(p1.Y, p2.Y) - Game1.screenHeight/2, Math.Max(p1.Y, p2.Y) + Game1.screenHeight/2); 
return new Point(x, y); 

कचरा संग्रहण मुद्दे का एक हिस्सा है है?

इसे हल करने पर कोई सुझाव या समाधान ??

उत्तर

10

शायद आप एक लूप में एक नया रैंडम ऑब्जेक्ट बना रहे हैं।

for (/* ... */) { 
    int x = new Random().Next(); // Don't do this! 
    // ... 
} 

प्रोग्राम स्टार्टअप पर यादृच्छिकता का केवल एक उदाहरण बनाने का प्रयास करें, फिर इसका पुन: उपयोग करें। यदि आपके पास एकाधिक धागे हैं, तो आप प्रति थ्रेड एक यादृच्छिक वस्तु का उपयोग कर सकते हैं।

+0

अहह विश्वास नहीं कर सकता कि मैंने यह नहीं देखा। मदद के लिए बहुत बहुत धन्यवाद। – FrenchyNZ

6

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

जवाब अपने कार्यक्रम के दौरान पुन: उपयोग करने एकRandom उदाहरण है - लेकिन तथ्य यह है कि Random धागा सुरक्षित नहीं है के नोट लेने। यदि यूआई थ्रेड में आपका पूरा काम किया जा रहा है, तो आप ठीक होंगे - लेकिन अन्यथा आप मेरे article about Random में दिए गए दृष्टिकोणों में से एक का उपयोग करना चाहेंगे (जो इस समस्या के बारे में अधिक बात करता है)।


और हाँ, अब है कि आप वास्तव में कोड मामला है कि पोस्ट किया है।

+0

रैंडम पर जानकारी के लिए धन्यवाद "थ्रेड-सुरक्षित" भी बहुत उपयोगी नहीं है – FrenchyNZ