2016-04-02 21 views
6

मैं हाल ही में एक और पद का और उस चर्चा में टिप्पणी में एक ही प्रकार के कई यादृच्छिक संख्या जनरेटर की initialisation चर्चा कर रहे थे हम निम्न सवाल पूछा:सीडिंग एकाधिक यादृच्छिक संख्या जनरेटर

1) यह एक अच्छा है विभिन्न बीज के साथ एक ही यादृच्छिक संख्या जनरेटर के कई उदाहरण बनाने का विचार करें और प्रोग्राम के विभिन्न हिस्सों में इन यादृच्छिक संख्या जेनरेटर का उपयोग करें?

2) विशेष रूप से, नेट रैंडम वर्ग का उपयोग कर यादृच्छिक संख्या जनरेटर, नीचे के रूप में वरीयता प्राप्त बनाने, और विभिन्न कार्यक्रम संदर्भों में प्रत्येक RNG का उपयोग करने का तकनीक पैदा कर सकता है समस्याओं:

int size = 64; // The number of RNGs to use 
int seed;  // Get seed using some normal technique 
Random[] r = new Random[size]; 

for (int i = 0; i < size; i++) 
{ 
    r[i] = new Random(seed + i); 
} 

3) क्या होगा यदि आप यादृच्छिक संख्याओं की कई धाराओं की आवश्यकता है तो आप इसके बजाय अनुशंसा करते हैं?

4) थ्रेड सुरक्षा की आवश्यकता होने पर आप यादृच्छिक संख्याएं उत्पन्न करने की सलाह कैसे देंगे?

+0

यह प्रश्न निम्नलिखित प्रश्नों के उत्तर में टिप्पणियों के उत्तर के रूप में बनाया गया है: [कैसे-करें-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

उत्तर

11

1) क्या यह अलग-अलग बीजों के साथ एक ही यादृच्छिक संख्या जनरेटर के कई उदाहरण बनाने और प्रोग्राम के विभिन्न हिस्सों में इन यादृच्छिक संख्या जेनरेटर का उपयोग करना अच्छा विचार है?

नहीं। उपरोक्त योजना सामान्य रूप से अनुशंसित नहीं है।

अपनी पुस्तक, द आर्ट ऑफ कंप्यूटर प्रोग्रामिंग, वॉल्यूम 2: सेमिन्यूमेरिकल एल्गोरिदम। एडिसन-वेस्ले, रीडिंग, एमए, तीसरा संस्करण, 1 99 7, डॉ। नूथ ने कहा कि

यादृच्छिक संख्याओं के मूर्खतापूर्ण स्रोत का आविष्कार करना आसान नहीं है।

इस मामले में, मैं कहना है कि एक यादृच्छिक अनुक्रम से subsequences लेने यादृच्छिक संख्या की मूल अनुक्रम की तुलना में कम यादृच्छिक हो सकता है:

सूचना कि माइक्रोसॉफ़्ट का रैंडम कार्यान्वयन एक घटिया लगी-फाइबोनैकी जनरेटर पर आधारित है:

यादृच्छिक संख्या जनरेटर इनबिल्ट थ्री-पॉइंट सहसंबंध लिए जाना जाता है इस तरह की, सब के बाद, हम अगले यादृच्छिक संख्या जेनरेट कर रहे हैं: Subtractive Lagged-Fibonacci Generator

यादृच्छिक संख्या के इन प्रकार जनरेटर भी अपने प्रारंभिक 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 से उत्पादन का प्रतिनिधित्व करता है:

Output of the program

सूचना है कि प्रकाश डाला कॉलम: विशेष रूप से आरएनजी उत्पादन को सिंक्रनाइज़ और उत्पादन करने लगते हैं जो एक-दूसरे से स्वतंत्र नहीं दिखते हैं।

मैं भी एक और नोट जोड़ना चाहता हूं, जो यादृच्छिक संख्याओं की एक सूची बना रहा है और प्रत्येक पंक्ति की सूची से एक यादृच्छिक संख्या लेना भी खराब दिखने वाले यादृच्छिक संख्या उत्पन्न करता है (यहां इस्तेमाल होने वाले आरएनजी को कुछ सांख्यिकीय विफल होने के लिए जाना जाता है आख़िरकार!)।

3) आरएनजी का प्रकार आपके संदर्भ पर निर्भर करता है। कुछ उपरोक्त आउटपुट से खुश हो सकते हैं। अन्य मामलों में, इस्तेमाल किया जाने वाला आरएनजी अनुपयोगी हो सकता है (मोंटे कार्लो सिमुलेशन और क्रिप्टोग्राफी दो परिदृश्य हैं जहां System.Random को कभी का उपयोग नहीं किया जाना चाहिए, यहां तक ​​कि यादृच्छिक संख्याओं की एक स्ट्रीम के लिए भी)।

आप यादृच्छिक संख्या के कई subsequences को निकालने के लिए, एक RNG कि उस उद्देश्य के लिए डिजाइन किया गया है लगता है की जरूरत है:

4) अंत में, मैं क्या सिस्टम उपयोग करना चाहते हैं कई धागे में यादृच्छिक?

+0

यह आपके किसी भी से अधिक विश्वासयोग्य है टिप्पणियां ... हालांकि किसी भी समय से चुनने के लिए केवल 3 संख्याओं के साथ, यह * आश्चर्यजनक * नहीं है। (यदि आप उदाहरण के लिए 'अगला (100)' के साथ एक ही पैटर्न दिखाएंगे, तो यह और भी आश्चर्यजनक होगा। –

+0

@ जोन्स स्केट यह आश्चर्यजनक है। विचार उच्च, मध्यम और निम्न संख्याओं को दिखाने का है। आरएनजी निर्णय ले रहे हैं "एक ही समय में" बड़ी संख्या में आउटपुट। एक और कॉलम दिखाई देता है जिसे मैंने दूसरे के बाद याद किया। 13 नंबरों की संभावना एक ही समय में "छोटी" है (दूसरे कॉलम में ऊपर दिखाया गया है) लगभग 1.5 में से 1 है लाखों। अक्सर आप कुछ क्रियाओं के बीच चयन करने या पासा रोल अनुकरण करने के लिए समान यादृच्छिक संख्याओं का उपयोग करते हैं।(इसके अलावा, मैंने कभी भी टिप्पणी में अधिक संदर्भ और जानकारी को जोड़ा नहीं होगा - वास्तव में, टिप्पणियां हैं।) – Andrew

+0

मैंने अपने उत्तर से इस पोस्ट का एक लिंक जोड़ा है। यह किसी भी चीज के रूप में लगातार बीजों का उपयोग करने के साथ एक मुद्दा की तरह लगता है। जैसा कि मैंने अपने उत्तर में पोस्ट किया है, एक और विकल्प "मास्टर" 'रैंडम' का उपयोग करना होगा, जो उस थ्रेड के 'रैंडम' के लिए बीज उत्पन्न करने के लिए प्रति थ्रेड में लॉक हो जाएगा। अपने परीक्षण कोड के साथ उस दृष्टिकोण को आजमाने के लिए मेरे लिए एक ही पैटर्न नहीं दिखाता है। क्या आप सहमत होंगे कि यह एक सुधार है, या फिर भी आप मूल रूप से दृष्टिकोण पर आक्षेप करते हैं? –

1

सुनिश्चित नहीं हैं कि "यादृच्छिक संख्या के कई धाराओं" का अर्थ है: माइक्रोसॉफ्ट MSDN एक ही कड़ी में इस सवाल का जवाब मैं ऊपर करने के लिए भेजा है। यादृच्छिक संख्या में किसी भी दो यादृच्छिक संख्याओं के बीच कोई संबंध नहीं है, कोई आदेश नहीं है, प्रत्येक एक स्टैंडअलोन उदाहरण है।

यदि आप क्रिप्टोग्राफिक पीआरएनजी का उपयोग नहीं करते हैं तो कोई बीजिंग आवश्यक नहीं है। .net RNGCryptoServiceProvider Class पर विचार करें।

+0

क्रिप्टोग्राफिक पीआरएनजी सामान्य रूप से अनिवार्य रूप से यादृच्छिक डेटा के साथ बीजित होते हैं जैसे कि सीपीयू इंटरप्ट टाइम और अन्य रीयलटाइम घटनाएं जिनमें कुछ मामलों में वायु अशांति के कारण हार्ड ड्राइव प्लेटर गति में बदलाव शामिल होते हैं। अगली संख्या किसी भी परीक्षण द्वारा पूरी तरह से निर्धारिती नहीं है और आउटपुट वास्तविक यादृच्छिकता से स्पष्ट नहीं है। ये केवल फैंसी रैखिक संगत जनरेटर नहीं हैं। उपयोगकर्ता कोड में अधिक यादृच्छिकता पैदा करने का एक बेहतर मनोरंजक सरल नहीं है। – zaph

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