2011-02-01 13 views
6

मैं यादृच्छिक संख्या का अनुक्रम उत्पन्न करने के लिए रैंडम का उपयोग कर रहा हूं। मैं केवल यादृच्छिक वस्तुओं (उनमें से 300) उत्पन्न करने वाले लूप के अंदर यादृच्छिक वस्तु का निर्माण कर रहा हूं। समस्या मुझे लगता है कि एक बार मैं सभी मूल्यों को प्राप्त और उन पर एक तरह से करते हैं उनमें से कुछ समान और/या अनुक्रमिक हैं वह यह है कि:यादृच्छिक नहीं है कि यादृच्छिक

: मैं 50000.

0 से संख्या पैदा कर रहा हूँ यह मेरी स्क्रिप्ट है

Random rnd = new Random(); 
for (int n=0; n < 300; n++) 
{ 
    int RndNumber = rnd.Next(0, 50000); 
    System.Threading.Thread.Sleep(3); 
} 

क्या किसी के पास यह संकेत हो सकता है कि यह क्यों हो रहा है, और इसे और अधिक यादृच्छिक बनाने के लिए मैं इसे कैसे सुधार सकता हूं?

+0

आप आप कैसे परिभाषित "और अधिक यादृच्छिक" – cordialgerm

+1

कारण है कि आप यादृच्छिक संख्या छँटाई के बारे में विशिष्ट होने की जरूरत है? क्या यादृच्छिक संख्या उत्पन्न करने के उद्देश्य को हराने में नहीं? – helloworld922

+0

समस्या सॉर्टिंग के साथ हो सकता है? – Marlon

उत्तर

11

की एक विवरण के रूप में क्यों आप समय-समय डुप्लिकेट को देख रहे हैं, Jason's answer दाईं ओर है।

यदि आप चाहते हैं तो 300 अलग-अलग यादृच्छिक संख्याएं हैं, इस तरह के बारे में क्या?

static IEnumerable<int> GetRandoms(int min, int max) 
{ 
    var rand = new Random(); 
    while (true) 
    { 
     yield return rand.Next(min, max); 
    } 
} 

var distinctRandoms = GetRandoms(0, 50000).Distinct().Take(300); 
+0

यूप यह अलग संख्या देता है लेकिन यह अभी भी संयोजन संख्या है, यह मेरा जन्मदिन विरोधाभास के कारण है। ऐसा लगता है कि मुझे क्या करना है। धन्यवाद दान ताओ – Terrence

+2

ध्यान रखें कि भेद को मजबूर करकर, आप वास्तव में "यादृच्छिकता" को नुकसान पहुंचा रहे हैं - वितरण अब (छद्म) वर्दी नहीं है। – bavaza

+1

@bavaza: सुनिश्चित नहीं है कि यह टिप्पणी मेरे या ओपी के लिए लक्षित है, लेकिन मुझे लगता है कि ओपी वास्तव में सच * यादृच्छिकता * नहीं चाहता है; अन्यथा वह इस सवाल नहीं पूछेंगे। बेशक आप सही हैं कि डुप्लिकेट को समाप्त करने से डेटा की यादृच्छिकता समझौता होती है, जैसे सॉर्टिंग करता है। –

21

तो यह जन्मदिन विरोधाभास * है। जब आप अनुमानित संभावना 50000 से 300 नंबर आकर्षित है कि उनमें से कम से कम दो बराबर हैं

p(300) = 1 - exp(-300 * 300/(2 * 50000)) 
     = 0.59 

है (मैं सटीक संभावना बाहर काम कर सकता था, लेकिन मैं आलसी हूँ!।)

तो, संभावना है कि आप टकराव नहीं करेंगे। अनुक्रमिक और भी अधिक संभावना है (अब आपको टकराव की आवश्यकता नहीं है, आपको n के लिए हिट करने के लिए n - 1 और n या n और n + 1 की आवश्यकता है)।

यादृच्छिक गुदगुदी है।

*: यदि आप इससे परिचित नहीं हैं, तो यह कहता है कि यदि आपके कमरे में पच्चीस लोग हैं, तो यह अपेक्षा नहीं है कि कमरे में कम से कम दो लोग समान जन्मदिन साझा करते हैं ।

!: ठीक है, मैंने इसे काम किया। यह 0.5953830515549951746819986449 ....

+2

+1, बहुत अच्छी स्पष्टीकरण – Marlon

11

अनुसंधान:

हाय दोस्तों,

अगर आप मानकों new Random() बीज वर्तमान servertime पर निर्भर करता है बिना निर्माता का उपयोग करें।

रैंडम(): "यादृच्छिक वर्ग का एक नया उदाहरण आरंभीकृत, पर निर्भर समय एक का उपयोग कर" http://msdn.microsoft.com/en-us/library/system.random.aspx

तो, अगर मैं इसे इस तरह का प्रयास करें:

for(int i = 0; i < 1000; i++) 
{ 
    Random ran = new Random(); 
    Console.WriteLine(ran.Next(50001)); 
} 

मुझे केवल हजारों कॉलों के भीतर 300 बार 3 अलग-अलग नंबर मिलते हैं! यादृच्छिक नहीं है ...

निर्माता new Random(0) में बीज सेट करना संख्याओं की एक निश्चित सेरी देता है।

उदा। new Random(0).Next(50)हमेशा! 36 देता है। यदि आप मुझ पर भरोसा नहीं करते हैं, तो इसे स्वयं आज़माएं;

हमें "वास्तविक" यादृच्छिक संख्याओं के लिए क्या चाहिए, एक बदलते बीज है, जो समय से स्वतंत्र है।

मैं बदलते मूल्यों के हैशकोड का उपयोग कर रहा हूं:

उदा। Guid.NewGuid().GetHashCode() या DateTime.Now.GetHashCode()


परिणाम:

Random ran = new Random(Guid.NewGuid().GetHashCode()); 
for(int i = 0; i < 1000; i++) 
{  
    Console.WriteLine(ran.Next(50001)); 
} 

या (बेहतर प्रदर्शन के लिए):

for(int i = 0; i < 1000; i++) 
{ 
    int val = Guid.NewGuid().GetHashCode() % 50001; 
    val = val > 0 ? val : -val; 
    Console.WriteLine(val); 
} 

पुनश्च: अगली (अधिकतम) -method की अधिकतम हमेशा अधिकतम है - 1;

-> ran.Next (11) 0,1,2, ..., 8, 9, 10 लौटा सकता है। 11 नहीं!

स्वागत करती है Bahamut =)

+1

'DateTime.Now.GetHashCode()' डिफ़ॉल्ट बीज से बेहतर नहीं है। – CodesInChaos

+0

+1 यह मेरी पसंद के लिए "यादृच्छिक" था :) जब मैंने 2000 को उत्पन्न करने की कोशिश की तो संख्याओं की कोई भी संख्या नहीं थी। – rtpHarry

+0

@CodesInChaos आपका अधिकार।मुझे बिल्कुल पता नहीं है कि रैंडम का डिफॉल्ट कन्स्ट्रक्टर डेटटाइम्स हैशकोड या मिलीसेकंड या जो कुछ भी उपयोग करता है, लेकिन यह – Bahamut

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