2010-06-16 19 views
6

एक लूप में यादृच्छिक संख्या उत्पन्न करने में कोई समस्या है। थ्रेड का उपयोग करके इसे चारों ओर प्राप्त कर सकते हैं। सो जाओ लेकिन एक और अधिक सुरुचिपूर्ण समाधान के बाद।लूप में यादृच्छिक संख्या

for ... 
    Random r = new Random(); 
    string += r.Next(4); 

आदि

सुझाव 11111 ... 222 के साथ खत्म हो जाएगा ...?

+1

यदि यह लूप कुछ पुनरावृत्तियों से अधिक है, तो आप 'स्ट्रिंगबिल्डर' ऑब्जेक्ट के पक्ष में स्ट्रिंग कॉन्सटेनेशन छोड़ना चाहेंगे। –

+5

@ एंथनी: नहीं, उसे प्रत्येक पुनरावृत्ति _more_ समय का उपयोग करने की आवश्यकता है। –

+0

@ हेंक ... जाहिर है। हो सकता है कि मैं एक ही स्थान के एकाधिक संयोजनों के साथ लूप के लिए नेस्टेड का सुझाव दे, तुरंत स्ट्रिंग के साथ एकल स्थान को बदलकर। –

उत्तर

50

लूप से यादृच्छिक संख्या जनरेटर की घोषणा को ले जाएं।

यादृच्छिक संख्या पीढ़ी बीज मूल्य से शुरू होती है। यदि वही बीज बार-बार उपयोग किया जाता है, तो संख्याओं की एक ही श्रृंखला उत्पन्न होती है। विभिन्न अनुक्रमों का उत्पादन करने का एक तरीका बीज मूल्य को समय-निर्भर बनाने के लिए है, जिससे रैंडम के प्रत्येक नए उदाहरण के साथ एक अलग श्रृंखला का उत्पादन होता है। डिफ़ॉल्ट रूप से, रैंडम वर्ग के parameterless निर्माता, इसके बीज मूल्य उत्पन्न करने के लिए सिस्टम घड़ी का उपयोग करता है ...

Source

पाश में घोषणा होने आप को प्रभावी ढंग से एक ही साथ निर्माता बुला रहे हैं तक मूल्य बार-बार - इसलिए आपको वही संख्या मिल रही है।

तो अपने कोड हो जाना चाहिए:

Random r = new Random(); 
for ... 
    string += r.Next(4); 
9
Random r = new Random(); 
for ... 
    string += r.Next(4); 

new Random() एक बीज वर्तमान दिनांक और समय के आधार पर के साथ (छद्म) यादृच्छिक संख्या जनरेटर प्रारंभ हो जाएगा। इस प्रकार, उसी दिनांक और समय पर बनाए गए Random के दो उदाहरण संख्याओं के समान अनुक्रम प्राप्त करेंगे।

आपने प्रत्येक पुनरावृत्ति में एक नया यादृच्छिक संख्या जनरेटर बनाया और फिर उस अनुक्रम का पहला मान लिया। चूंकि यादृच्छिक संख्या जेनरेटर समान थे, इसलिए उनके अनुक्रमों का पहला मान समान था। मेरा समाधान एक यादृच्छिक संख्या जनरेटर बनाएगा और फिर पहला, दूसरा, आदि ... अनुक्रम का मूल्य (जो अलग होगा) वापस करेगा।

2

आपको हर बार एक नया निर्माण करने के बजाय एक ही यादृच्छिक उदाहरण का उपयोग करना चाहिए।

तुम्हारे पास है के रूप में:

for ... 
    Random r = new Random(); 
    string += r.Next(4); 

बीज मूल्य प्रत्येक (वर्तमान टाइमस्टैम्प करने के लिए इसे चूक) के लिए एक ही है, इसलिए दिए गए मान में ही है।

तो जैसे किसी एक यादृच्छिक उदाहरण पुन: उपयोग द्वारा:

Random r = new Random() 
for ... 
    string += r.Next(4); 

हर बार जब आप फोन r.Next(4) मान अपडेट होता है (प्रत्येक कॉल के लिए मूल रूप से एक अलग बीज)।

3

लूप के बाहर Random r = new Random(); ले जाएं और लूप के अंदर बस कॉल करें।

+1

मुझे पृष्ठ को फिर से लोड करना चाहिए था। एलओएल हर किसी के पास एक ही जवाब था – used2could

+0

प्रश्न "लूप्स के अंदर" – Mironline

+0

@Mironline हो सकता है कि आपने मेरा पूरा जवाब नहीं पढ़ा, मैं भी "लूप के अंदर अगला" छोड़ने के लिए कहता हूं। स्वीकार्य उत्तर बिल्कुल वैसा ही था जैसा मैंने वर्णन किया था, इसलिए मुझे लगता है कि यह ओपी के अनुरोध में फिट है। – used2could

2

मैं चीनी में एक पृष्ठ है कि समय के साथ एक ही कहा मिला: http://godleon.blogspot.hk/2007/12/c.html, यह आप इस तरह टाइप करता है, तो कहा:

Random random = new Random(Guid.NewGuid().GetHashCode());

तुम भी एक पाश में एक यादृच्छिक संख्या प्राप्त कर सकते हैं! यह मेरा प्रश्न भी हल किया!

+0

इसे धीमा क्यों करें, बस 'Guid.NewGuid()। GetHashCode() 'पर्याप्त होगा – nawfal

+0

@nawfal मैं वास्तव में समझ नहीं पा रहा हूं कि आप क्या कह रहे हैं ?? !! क्या मैंने ऐसा नहीं किया? –

+0

मेरा मतलब था 'Guid.NewGuid()। GetHashCode() '' नया रैंडम (Guid.NewGuid()। GetHashCode()) से तेज़ होगा। दोनों यादृच्छिक पूर्णांक – nawfal

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