1) क्या यह अलग-अलग बीजों के साथ एक ही यादृच्छिक संख्या जनरेटर के कई उदाहरण बनाने और प्रोग्राम के विभिन्न हिस्सों में इन यादृच्छिक संख्या जेनरेटर का उपयोग करना अच्छा विचार है?
नहीं। उपरोक्त योजना सामान्य रूप से अनुशंसित नहीं है।
अपनी पुस्तक, द आर्ट ऑफ कंप्यूटर प्रोग्रामिंग, वॉल्यूम 2: सेमिन्यूमेरिकल एल्गोरिदम। एडिसन-वेस्ले, रीडिंग, एमए, तीसरा संस्करण, 1 99 7, डॉ। नूथ ने कहा कि
यादृच्छिक संख्याओं के मूर्खतापूर्ण स्रोत का आविष्कार करना आसान नहीं है।
इस मामले में, मैं कहना है कि एक यादृच्छिक अनुक्रम से subsequences लेने यादृच्छिक संख्या की मूल अनुक्रम की तुलना में कम यादृच्छिक हो सकता है:
सूचना कि माइक्रोसॉफ़्ट का रैंडम कार्यान्वयन एक घटिया लगी-फाइबोनैकी जनरेटर पर आधारित है:
यादृच्छिक संख्या जनरेटर इनबिल्ट थ्री-पॉइंट सहसंबंध लिए जाना जाता है इस तरह की, सब के बाद, हम अगले यादृच्छिक संख्या जेनरेट कर रहे हैं:
यादृच्छिक संख्या के इन प्रकार जनरेटर भी अपने प्रारंभिक 55 नंबर राज्य के प्रारंभिकरण पर भारी निर्भर करते हैं। खराब प्रारंभिकरण खराब यादृच्छिक संख्या का कारण बन सकता है। उपर्युक्त मामले में, समान राज्यों में, परिणामस्वरूप प्रत्येक अलग-अलग यादृच्छिक संख्या जेनरेटर से यादृच्छिक संख्याएं हो सकती हैं। माइक्रोसॉफ्ट भी System.Random के बारे में उनके MSDN पोस्ट में इस के खिलाफ सिफारिश की गई है: MSDN The System.Random class and thread safety:
इसके बजाय अलग-अलग यादृच्छिक वस्तुओं instantiating की हमारी सलाह है कि आप एक ही रैंडम उदाहरण सभी यादृच्छिक अपने अनुप्रयोग के लिए आवश्यक संख्या उत्पन्न करने के लिए पैदा करते हैं।
हम एक उदाहरण देखेंगे जहां एक विशेष प्रारंभिकरण विभिन्न यादृच्छिक संख्या जेनरेटर के बीच मजबूत सहसंबंध बनाता है और विकल्पों की तलाश करता है।
2) मैंने एक प्रोग्राम लागू किया है जो उपरोक्त वर्णित रैंडम के 64 उदाहरणों को शुरू करने का प्रयास करता है ताकि हम किसी भी दिखाई देने वाली त्रुटियों को देख सकें। मैं अवधारणा का एक सबूत के रूप में एक विशेष initialisation चुना है:
int size = 64; // The number of random numbers generators
int length = 20; // The number of random numbers from each generator
int steps = 18; // Move 18 steps forward in the beginning to show a particular phenomenon
Random[] r = new Random[size];
for (int i = 0; i < size; i++)
{
r[i] = new Random(i + 1);
// move RNG forward 18 steps
for (int j = 0; j < steps; j++)
{
r[i].Next(3);
}
}
for (int i = 0; i < size; i++)
{
for (int j = 0; j < length; j++)
{
Console.Write(r[i].Next(3) + ", "); // Generate a random number, 0 represents a small number, 1 a medium number and 2 a large number
}
Console.WriteLine();
}
इस कार्यक्रम के उत्पादन यहाँ दिखाया गया है उत्पन्न करता है, प्रत्येक पंक्ति एक और RNG से उत्पादन का प्रतिनिधित्व करता है:
सूचना है कि प्रकाश डाला कॉलम: विशेष रूप से आरएनजी उत्पादन को सिंक्रनाइज़ और उत्पादन करने लगते हैं जो एक-दूसरे से स्वतंत्र नहीं दिखते हैं।
मैं भी एक और नोट जोड़ना चाहता हूं, जो यादृच्छिक संख्याओं की एक सूची बना रहा है और प्रत्येक पंक्ति की सूची से एक यादृच्छिक संख्या लेना भी खराब दिखने वाले यादृच्छिक संख्या उत्पन्न करता है (यहां इस्तेमाल होने वाले आरएनजी को कुछ सांख्यिकीय विफल होने के लिए जाना जाता है आख़िरकार!)।
3) आरएनजी का प्रकार आपके संदर्भ पर निर्भर करता है। कुछ उपरोक्त आउटपुट से खुश हो सकते हैं। अन्य मामलों में, इस्तेमाल किया जाने वाला आरएनजी अनुपयोगी हो सकता है (मोंटे कार्लो सिमुलेशन और क्रिप्टोग्राफी दो परिदृश्य हैं जहां System.Random को कभी का उपयोग नहीं किया जाना चाहिए, यहां तक कि यादृच्छिक संख्याओं की एक स्ट्रीम के लिए भी)।
आप यादृच्छिक संख्या के कई subsequences को निकालने के लिए, एक RNG कि उस उद्देश्य के लिए डिजाइन किया गया है लगता है की जरूरत है:
4) अंत में, मैं क्या सिस्टम उपयोग करना चाहते हैं कई धागे में यादृच्छिक?
यह प्रश्न निम्नलिखित प्रश्नों के उत्तर में टिप्पणियों के उत्तर के रूप में बनाया गया है: [कैसे-करें-i-seed-a-random-class-to-Avo-getting-duplicate-random-values] (http://stackoverflow.com/questions/1785744/how-do-i-seed-a-random-class-to-avoid-getting-duplicate-random-values/1785821) – Andrew