2012-11-19 32 views
5

के लिए यादृच्छिक पुनरावृत्ति में मैं एक लूप बनाना चाहता हूं जो यादृच्छिक क्रम में 0-8 के माध्यम से लूप करता है। ध्यान दें कि प्रत्येक नंबर केवल एक बार देखी जा सकती है।लूप

मैं इसे कैसे प्राप्त कर सकता हूं?

+3

[यह तो सवाल] (http://stackoverflow.com/ प्रश्न/254844/यादृच्छिक-सरणी-उपयोग-linq-and-c-sharp) जो आप – Zbigniew

+0

खोज रहे हैं, मैंने पूर्णांक 0-8 की सूची बनाने और लेने पर प्रयास किया है ई यादृच्छिक रूप से और बाद में इसे हटा रहा है। लेकिन मेरे कार्यक्रम में मैं एक पुनरावर्ती विधि का उपयोग कर रहा हूं जहां ऐसा समाधान व्यावहारिक नहीं है –

+0

@ ब्रूनोकार्वालहल शायद आपको एक नमूना पोस्ट करना चाहिए कि आपने अपना रिकर्सन कैसे डिज़ाइन किया है क्योंकि यह आपके प्रश्न/उत्तर के लिए एक महत्वपूर्ण तत्व प्रतीत होता है। –

उत्तर

14
Random r = new Random(); 
foreach (int i in Enumerable.Range(0, 9).OrderBy(x => r.Next())) 
{ 
    Console.WriteLine(i); 
} 
+0

जो मैं टाइप करने वाला था और यहां जो भी जुड़ा हुआ है उसके समान है http://stackoverflow.com/a/254861/659190 – Jodrell

+1

बिल्कुल सही!ठीक वही जो मेरे द्वारा खोजा जा रहा था। मुझे लूप पर बहुत ध्यान केंद्रित हुआ, जबकि मुझे इस फ़ोरैच लूप का उपयोग करना चाहिए था। –

+0

ग्रेट उत्तर। अगर यह मेरे जैसे अन्य नोबों की मदद करता है, तो IENumerable.OrderBy सिस्टम में एक विस्तार विधि है। लिंक नामस्थान। – geo

6
  1. के सूचकांकों की एक सरणी उत्पन्न उस स्थिति में सूचकांक का उपयोग कर सरणी पर सरणी शफ़ल
  2. दोहराएं
+0

दुनिया में क्यों आपने 8 बाहर निकाला? – LMB

+0

शायद एक टाइपो – RvdK

+0

शायद यह समझना गलत है कि यह लंबाई '8' की सरणी/सूची थी, इसलिए आप केवल तत्व सूचकांक '0' से' 7' चाहते हैं। –

1

एक संभावना:

var numbers = Enumerable.Range(0, 9).ToList(); 
var rnd = new Random(); 
for (; numbers.Count != 0;) 
{ 
    var currentNumber = numbers[rnd.Next(0, numbers.Count)]; 

    Console.WriteLine(currentNumber); 

    numbers.Remove(currentNumber); // remove current random number from list 
} 

Enumerable.Range(0, 9).ToList() एक ली बनाता है संख्या 0 से 8. में लूप में हम सूची से यादृच्छिक संख्या चुनते हैं और लूप के अंत में सूची से इसे हटाते हैं, ताकि अगला चक्र इसे फिर से नहीं चुना जा सके।

0

इसे वेब खोज से मिला - फिशर-येट्स शफल, पर्ल में लागू किया गया।

इससे किसी भी इनपुट सरणी का निष्पक्ष यादृच्छिकरण उत्पन्न होगा।

sub fisher_yates_shuffle { 
    my $array = shift; 
    my $i; 
    for ($i = @$array; --$i;) { 
     my $j = int rand ($i+1); 
     next if $i == $j; 
     @$array[$i,$j] = @$array[$j,$i]; 
    } 
} 

अधिक जानकारी के लिए:

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

और मूल मैंने पाया था से:

http://perl.livejournal.com/101830.html

+0

सी # –

+2

के लिए बहुत अधिक '$' s 'सी #' –

+0

के लिए बहुत अधिक 'perl' कोड के मुकाबले यह अधिक एल्गोरिदम है। सी # में रैंडम() फ़ंक्शन की निष्पक्ष प्रकृति के लिए बात नहीं कर सकता, जबकि फिशर-येट्स निश्चित रूप से है। – tbh