2010-04-28 19 views
9

हैलो मुझे सी # के साथ यादृच्छिक संख्याएं उत्पन्न करने में कुछ समस्याएं आ रही हैं अब मेरे पास यह कार्य है।यादृच्छिक मुठभेड़ इतना यादृच्छिक नहीं है

public Color getRandomColor() 
{ 
    Color1 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255)); 
    Color2 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255)); 
    Color3 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255)); 
    Color color = Color.FromArgb(Color1, Color2, Color3); 
    Console.WriteLine("R: " + Color1 + " G: " + Color2 + " B: " + Color3 + " = " + color.Name); 
    return color; 
} 

अब आप नए रैंडम का एक बहुत देखते हैं कि() वहाँ, वह यह है कि क्योंकि मैं संभावना यह एक ही उदाहरण त्रुटि हो सकती है कि उखाड़ फेंकने के लिए चाहते हैं देख सकते हैं।

अब मैं इस समारोह को दो बार चलाता हूं, दो बार। अब आउट आउट हैं।

R: 65 G: 65 B: 65 = ff414141 
R: 242 G: 242 B: 242 = fff2f2f2 
R: 205 G: 205 B: 205 = ffcdcdcd 
R: 40 G: 40 B: 40 = ff282828 
R: 249 G: 249 B: 249 = fff9f9f9 
R: 249 G: 249 B: 249 = fff9f9f9 
R: 94 G: 94 B: 94 = ff5e5e5e 
R: 186 G: 186 B: 186 = ffbababa 

R: 142 G: 142 B: 142 = ff8e8e8e 
R: 190 G: 190 B: 190 = ffbebebe 
R: 19 G: 19 B: 19 = ff131313 
R: 119 G: 119 B: 119 = ff777777 
R: 119 G: 119 B: 119 = ff777777 
R: 75 G: 75 B: 75 = ff4b4b4b 
R: 169 G: 169 B: 169 = ffa9a9a9 
R: 127 G: 127 B: 127 = ff7f7f7f 

R: 73 G: 73 B: 73 = ff494949 
R: 27 G: 27 B: 27 = ff1b1b1b 
R: 125 G: 125 B: 125 = ff7d7d7d 
R: 212 G: 212 B: 212 = ffd4d4d4 
R: 174 G: 174 B: 174 = ffaeaeae 
R: 0 G: 0 B: 0 = ff000000 
R: 0 G: 0 B: 0 = ff000000 
R: 220 G: 220 B: 220 = ffdcdcdc 

जैसा कि आप देख सकते हैं कि यह फिर से यादृच्छिक नहीं है, लेकिन यह क्यों होता है? और मैं इसका सामना कैसे कर सकता हूं?

+0

मेरे पास एक सामान्य समस्या में यादृच्छिक रंग उत्पन्न करने वाला एक ही मुद्दा था। बीज प्रदान किए बिना एक त्वरित तरीका एक ही यादृच्छिक धारा का उपयोग करके एक साथ कुछ मूल्यों को अनुमति देना है। परिशुद्धता की कमी लेकिन थोड़ा और अधिक यादृच्छिक वितरण प्राप्त करने के लिए उपयोग किया जा सकता है। ईजी। int x = rng.Next()^rng.Next(); int परिमाण = x * x; फ्लोट वैल्यू = एक्स/(फ्लोट) परिमाण; –

+0

इस विधि का उपयोग करके आप निम्न द्वारा थोड़ा बेहतर रंग वितरण उत्पन्न कर सकते हैं। रंग = रंग = नया रंग ( (बाइट) (rand.Next (0, 255)^rand.Next (0, 255)), (बाइट) (rand.Next (0, 255)^rand.Next (0, 255)), (बाइट) (rand.Next (0, 255)^rand.Next (0, 255)), (बाइट) (rand.Next (0, 255)^rand.Next (0 , 255))) –

उत्तर

28

आप प्रत्येक एकल मूल्य के लिए एक नया Random बना रहे हैं।

एक अद्वितीय Random ऑब्जेक्ट बनाने का प्रयास करें और .Next() फ़ंक्शन को कई बार कॉल करें।

public Color getRandomColor() 
{ 
    Random rand = new Random(); 

    Color1 = rand.Next(rand.Next(0, 100), rand.Next(200, 255)); 
    Color2 = rand.Next(rand.Next(0, 100), rand.Next(200, 255)); 
    Color3 = rand.Next(rand.Next(0, 100), rand.Next(200, 255)); 
    Color color = Color.FromArgb(Color1, Color2, Color3); 
    Console.WriteLine("R: " + Color1 + " G: " + Color2 + " B: " + Color3 + " = " + color.Name); 
    return color; 
} 

MSDN documentation on Random object से लिया:

डिफ़ॉल्ट रूप से, रैंडम वर्ग के parameterless निर्माता सिस्टम घड़ी का उपयोग करता है, इसके बीज मूल्य उत्पन्न करने के लिए, जबकि इसकी पैरामिट्रीकृत निर्माता संख्या के आधार पर कोई Int32 मूल्य ले जा सकते हैं वर्तमान समय में टिकों का। हालांकि, क्योंकि घड़ी परिमित संकल्प है, पास लगातार विभिन्न यादृच्छिक वस्तुओं को बनाने के parameterless निर्माता का उपयोग कर यादृच्छिक संख्या जनरेटर है कि यादृच्छिक संख्या

+4

हाँ, यह जवाब है। रैंडम के उदाहरण एक दूसरे के बाद एक ही मूल्य देने की प्रवृत्ति के बाद बहुत जल्दी बनाया गया। मुझे लगता है कि ऐसा इसलिए है क्योंकि वे कंप्यूटर घड़ी से बीजित होते हैं, लेकिन यह जंगली अनुमान से ज्यादा कुछ नहीं है। –

+1

बिल्कुल। रैंडम में 2 कन्स्ट्रक्टर हैं। पैरामीटर रहित बीज बीज के रूप में वर्तमान समय का उपयोग करता है। आप एक पूर्णांक लेने वाले व्यक्ति का भी उपयोग कर सकते हैं। तो यह बीज के रूप में पारित तर्क का उपयोग करेगा। – emzero

+0

मेरा कोड शुरुआती में ऐसा दिखता था, हमने यह देखने के लिए कई उदाहरण बनाए कि क्या वह सहायक है। लेकिन अब हम मिल आर: 164 जी: 78 बी: 145 = ffa44e91 आर: 206 जी: 20 बी: 149 = ffce1495 आर: 206 जी: 20 बी: 149 = ffce1495 आर: 73 जी: 60 बी: 94 = एफएफ 4 9 3 सी 5e आर: 147 जी: 94 बी: 101 = एफएफ 9 35e65 आर: 212 जी: 123 बी: 61 = एफएफडी 47 बी 3 डी आर: 98 जी: 79 बी: 70 = एफएफ 624 एफ 46 आर: 85 जी: 110 बी: 79 = ff556e4f यह थोड़ा और यादृच्छिक है, लेकिन यदि आप परिणाम 2 और 3 देखते हैं तो वे वही हैं। – Androme

1

जब यह का एक उदाहरण का उपयोग करते हुए यादृच्छिक बेहतर काम करता है के समान दृश्यों का उत्पादन पैदा करता है। जिसकी वजह से उन्हें एक ही/लगभग एक ही टाइमस्टैम्प के साथ वरीयता प्राप्त किए जाने की

public Color getRandomColor() 
{ 
    var random = new Random(); 
    Color1 = random.Next(random.Next(0, 100), random.Next(200, 255)); 
    Color2 = random.Next(random.Next(0, 100), random.Next(200, 255)); 
    Color3 = random.Next(random.Next(0, 100), random.Next(200, 255)); 
    Color color = Color.FromArgb(Color1, Color2, Color3); 
    Console.WriteLine("R: " + Color1 + " G: " + Color2 + " B: " + Color3 + " = " + color.Name); 
    return color; 
} 
+0

एक यादृच्छिक उपयोग करने से धीमा लेकिन कुछ भी कैसे संपादित किया जाता है? यह निश्चित रूप से 'अधिक यादृच्छिक' नहीं है? – Will

+1

यह हर बार फ़ंक्शन कहलाए जाने पर भी वही "यादृच्छिक" रंग वापस करने में मदद करेगा। – Miles

5

आप पैदा कर रहे कई रैंडम क्रमिक रूप से वस्तुओं,:

इस प्रयास करें। इस प्रकार यादृच्छिक संख्याएं उत्पन्न होती हैं लेकिन उनमें से बराबर होती है।

रैंडम का एक उदाहरण बनाने का प्रयास करें और अपने सभी यादृच्छिक संख्या आवश्यकताओं के लिए इसका उपयोग करें।

7

प्रत्येक new Random()seeded with the current time है।

यदि आप त्वरित उत्तराधिकार में कई Random उदाहरण बनाते हैं, और आपकी मशीन इतनी तेज़ी से दौड़ती है कि वे एक ही बीज प्राप्त करने के लिए पर्याप्त रूप से निकट हैं, तो वे मूल्यों का एक ही अनुक्रम वापस कर देंगे!

प्रत्येक मान प्राप्त करने के लिए .Next() पर कॉल करके एक Random का उपयोग करें।

अब आप नए रैंडम की एक बहुत() वहाँ, कि है क्योंकि मैं संभावना है कि यह एक ही उदाहरण त्रुटि हो सकती है कि उखाड़ फेंकने के लिए चाहते हैं देखते हैं कि देख सकते हैं।

यह एक झूठ है; एक Random से संख्याओं की एक धारा समान रूप से वितरित की जाती है - प्रयास इसे यादृच्छिक बनाने में चला गया है।

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