2011-01-27 21 views
7

संभव डुप्लिकेट:यादृच्छिक() यादृच्छिक क्यों नहीं है?

static void Main(string[] args) 
{ 
    var randomNumbers = new Dictionary<int, int>(); 
    foreach (var s in Enumerable.Range(1, 500)) 
    { 
     var rand = Rand5(); 
     if (!randomNumbers.ContainsKey(rand)) 
      randomNumbers.Add(rand, 1); 
     else 
      randomNumbers[rand] += 1; 
    } 

    randomNumbers 
     .ToList() 
     .ForEach(x => Console.WriteLine("{0}: {1}", x.Key, x.Value)); 
    Console.ReadLine(); 
} 

static int Rand5() 
{ 
    System.Threading.Thread.Sleep(1); 
    return new Random().Next(1, 6); 
} 



अगर मैं System.Threading.Thread.Sleep(1); बाहर टिप्पणी, मैं

+०१२३५१६४१०६१:

Why does this Random Number Generator not random?

मैं इस परीक्षण कार्यक्रम है

5: 500 

लेकिन अगर मैं उस रेखा को अपूर्ण करता हूं, तो मुझे यादृच्छिक संख्या मिलती है।

2: 87 
4: 94 
1: 116 
5: 108 
3: 95 

कोड की रेखा क्यों मायने रखती है? धन्यवाद!

+0

मुझे लगता है कि इस तरह के प्रश्नों को डुप्लीज़ के रूप में चिह्नित करने के लिए व्यर्थ है क्योंकि संभवतः सभी * यादृच्छिक * -टैग किए गए प्रश्नों का एक तिहाई एक ही मुद्दा है .. – Joey

उत्तर

10

के रूप में अन्य लोगों ने कहा, मौजूदा सिस्टम का समय से new Random() बीज यादृच्छिक संख्या जनरेटर।

मेरे पास an article है जो इसे अधिक उपयोगी तरीके से वर्णन करता है, जिसमें समस्या के समाधान शामिल हैं, जिन्हें आप उपयोगी पा सकते हैं। असल में आप Random के एक ही उदाहरण का उपयोग करना चाहते हैं - लेकिन यह देखते हुए कि यह थ्रेड-सुरक्षित नहीं है।

+0

विस्तृत स्पष्टीकरण के साथ उत्तर के लिए धन्यवाद। वैसे, मैं गहराई 2 में अपना सी # पढ़ रहा हूं :) – bla

+0

वाह, यह एक अच्छा लेख है। मैं 10 मिनट पहले की तुलना में बेहतर मुद्दे को समझता हूं। –

+0

यही कारण है कि मैं चाहता हूं कि 'System.Random' एक स्थिर सिंगलटन था, आलसी शुरूआत में। –

3

कारण यह संख्या पैदा करने के लिए एक बीज के रूप में घड़ी का उपयोग कर रहा है और जब आप उस तरह से यादृच्छिक संख्या उत्पन्न, आप एक ही संख्या

2

यादृच्छिक संख्या जनरेटर सिस्टम घड़ी पर आंशिक रूप से आधारित है मिलता है, और सी # भी है तेजी से उन्हें बाहर मंथन ...

11

Random प्रकार वर्तमान सिस्टम समय के अनुसार डिफ़ॉल्ट रूप से बीजित होता है, जिसमें परिमित ग्रैन्युलरिटी होती है।

new Random().Next(1, 6) कॉलिंग new Random().Next(1, 6) तेजी से उत्तराधिकार में कई बार इस प्रकार के बीज मूल्य के साथ कई Random ऑब्जेक्ट्स का निर्माण करेगा, जो एक ही परिणाम उत्पन्न करेगा। Thread.Sleep(1) कॉल को इस समस्या को "हल" करता है, जो कि समय के साथ अलग-अलग बाधाओं को दूर करता है, अलग-अलग बीज मूल्यों की संभावना को बढ़ाता है।

आप अगले करने के लिए एक कॉल से एक विशिष्ट Random वस्तु बनाए रखने की आवश्यकता:

var randomNumbers = new Dictionary<int, int>(); 
var random = new Random(); // Re-use this, don't keep creating new ones. 
foreach (var s in Enumerable.Range(1, 500)) 
{ 
    var rand = random.Next(1, 6); 
    // ... 
1

आप यादृच्छिक बीज नहीं है, तो आप एक ही नंबर के रूप में रैंडम एक छद्म यादृच्छिक-जनरेटर

है का उपयोग कर Thread.Sleep (1) आप अग्रिम करने के लिए टाइमर और एक नया उत्पन्न करने के लिए अनुमति देने के द्वारा प्राप्त स्वत: जनरेट-बीज।

"ठीक करने" का एक तरीका 1 रैंडम ऑब्जेक्ट बनाना और इसे पुन: उपयोग करना है (जैसे कुछ अन्य ने भी उत्तर दिया), या एक अलग यादृच्छिक जनरेटर का उपयोग करें। http://msdn.microsoft.com/en-us/library/ctssatww.aspx

0

आप का उपयोग किसी भी यादृच्छिक संख्या जनरेटर पर

अधिक जानकारी एक छद्म यादृच्छिक संख्या है। यह हमेशा एक पूर्व परिभाषित बीज मूल्य होगा और परीक्षण के लिए अच्छा है लेकिन वास्तविक यादृच्छिकता की सुविधाओं को लागू करने के लिए नहीं।

आपको यादृच्छिक संख्या या बेहतर अभी भी उत्पन्न करने के लिए एक अर्ध-यादृच्छिक संख्या अनुक्रम का उपयोग करना चाहिए, मार्कोव श्रृंखला सर्वश्रेष्ठ यादृच्छिक संख्या उत्पन्न करने के लिए। यदि आप उन यादृच्छिक कार्यों में से किसी एक का उपयोग करने की योजना बना रहे हैं, तो आप वास्तविक यादृच्छिकता के करीब कुछ भी नहीं करेंगे।

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