मैंने Paint.Net plugin के साथ कुछ समस्या डीबग कर दी है और मैंने यादृच्छिक वर्ग के साथ कुछ समस्याएं ठोकर खाई हैं, जब कई धागे एक उदाहरण से एक विधि को कॉल करते हैं।यादृच्छिक मुद्दों के साथ रैंडम में समस्याएं?
कुछ अजीब कारणों से, ऐसा लगता है कि अगर मैं समवर्ती पहुंच को रोकता हूं, तो कॉल किए गए विधि को सिंक्रनाइज़ करके, मेरा रैंडम इंस्टेंस व्यवहार करना शुरू कर देता है ... यादृच्छिक रूप से (लेकिन बुरी भावना में)।
निम्नलिखित उदाहरण में, मैं कई सौ धागे बना देता हूं जो दोबारा एक रैंडम ऑब्जेक्ट को कॉल करते हैं। और जब मैं इसे चलाता हूं, तो कभी-कभी (हमेशा नहीं, लेकिन लगभग) स्पष्ट रूप से गलत परिणाम प्राप्त करते हैं। अगर मैं Synchronized
विधि एनोटेशन को अनदेखा करता हूं तो समस्या कभी नहीं होती है।
using System;
using System.Threading;
using System.Runtime.CompilerServices;
namespace testRandom {
class RandTest {
static int NTIMES = 300;
private long ac=0;
public void run() { // ask for random number 'ntimes' and accumulate
for(int i=0;i<NTIMES;i++) {
ac+=Program.getRandInt();
System.Threading.Thread.Sleep(2);
}
}
public double getAv() {
return ac/(double)NTIMES; // average
}
}
class Program
{
static Random random = new Random();
static int MAXVAL = 256;
static int NTREADS = 200;
//[MethodImpl(MethodImplOptions.Synchronized)]
public static int getRandInt() {
return random.Next(MAXVAL+1); // returns a value between 0 and MAXVAL (inclusive)
}
public static void Main(string[] args) {
RandTest[] tests = new RandTest[NTREADS];
Thread[] threads = new Thread[NTREADS];
for(int i=0;i<NTREADS;i++) {
tests[i]= new RandTest();
threads[i] = new Thread(new ThreadStart(tests[i].run));
}
for(int i=0;i<NTREADS;i++) threads[i].Start();
threads[0].Join();
bool alive=true;
while(alive) { // make sure threads are finished
alive = false;
for(int i=0;i<NTREADS;i++) { if(threads[i].IsAlive) alive=true; }
}
double av=0;
for(int i=0;i<NTREADS;i++) av += tests[i].getAv();
av /= NTREADS;
Console.WriteLine("Average:{0, 6:f2} Expected:{1, 6:f2}",av,MAXVAL/2.0);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
एक उदाहरण ouput (ऊपर मूल्यों के साथ):
Average: 78.98 Expected:128.00
Press any key to continue . . .
यह कुछ ज्ञात समस्या है? सिंक के बिना कई धागे से यादृच्छिक वस्तु को कॉल करना गलत है?
अपडेट: उत्तर के अनुसार, दस्तावेज़ बताते हैं कि यादृच्छिक विधियां थ्रेड सुरक्षित नहीं हैं - मुझे culpa, मुझे इसे पढ़ना चाहिए था। शायद मैंने इसे पहले पढ़ा था लेकिन यह इतना महत्वपूर्ण नहीं था - कोई (ढलान) सोच सकता है कि, एक ही विधि में एक ही विधि में प्रवेश करने वाले दुर्लभ घटनाओं में, सबसे बुरा यह हो सकता है कि उन कॉलों को गलत परिणाम मिलते हैं - नहीं एक बड़ा सौदा, अगर हम यादृच्छिक संख्या की गुणवत्ता के बारे में ज्यादा चिंतित नहीं हैं ... लेकिन समस्या वास्तव में विनाशकारी है, क्योंकि वस्तु एक असंगत स्थिति में छोड़ी गई है, और उस पर से रिटर्न शून्य लौटता रहता है - जैसा कि here उल्लेख किया गया है।
जब तक दस्तावेज़ दस्तावेज विरोध नहीं करता ई आप मान सकते हैं कि कोई भी वर्ग एकल उदाहरण तक पहुंचने वाले एकाधिक धागे का समर्थन करता है। – CodesInChaos