2010-01-07 6 views
5

में संख्या उत्पन्न और दोहराएं मैं एक सरणी उत्पन्न करना चाहता हूं जिसमें 1,7> से 36 नंबर यादृच्छिक क्रम में है (इसलिए प्रत्येक संख्या 4 बार दोहराई जाती है)। क्या हम संख्यात्मक उपयोग कर सकते हैं। दोहराना और गणना करने योग्य। ऐसा करने के लिए रेंज करें। यदि हां कृपया मुझे बताएं कि कैसे?सी #

उत्तर

10

ठीक है, में सभी नंबरों के साथ अनुक्रम बनाने आसान है:

var items = from x in Enumerable.Range(1, 36) 
      from y in Enumerable.Repeat(x, 4) 
      select y; 

तो फिर तुम सिर्फ ToArray उपयोग कर सकते हैं यह एक सरणी में मिलता है और यह शफ़ल करने के लिए। एसओ पर सी # में एक सरणी को घुमाने के बारे में कई सवाल हैं, जैसे कि this one। आप या तो सीधे उस कोड का उपयोग कर सकते हैं, या ToArray पर कॉल कर सकते हैं और इसे अंत में उपज किए बिना सरणी को स्थानांतरित कर सकते हैं।

+0

हे, कि मेरे समाधान की तुलना में अधिक पठनीय है। +1 –

+0

और अधिक सुरुचिपूर्ण है कि मेरे एकाधिक कंसैट;) –

+0

टिप्पणी के लिए धन्यवाद, लेकिन अब मुझे जेनरेटेड सरणी को [9, 16] सरणी में भरने की ज़रूरत है, क्या आप मेरे लिए एक अच्छा तरीका सुझा सकते हैं? –

0
int[] numbers = Enumerable.Range(0, 144).Select(i => (i % 36)+1).OrderBy(g => Guid.NewGuid()).ToArray(); 
+0

शायद इस मामले में महत्वपूर्ण नहीं है, लेकिन शफलिंग का यह तरीका ओ (एन लॉग एन) होने पर समाप्त होता है जहां इसे केवल ओ होना चाहिए (एन)। –

0
// Generate the list (not in random order) 
var one_to_36 = Enumerable.Range(1, 36); 
var lst = one_to_36.Concat(one_to_36).Concat(one_to_36).Concat(one_to_36).ToList(); 

// Randomize the list by swapping random elements 
Random rnd = new Random(); 
for(int i = 0; i < lst.Count; i++) 
{ 
    int i1 = rnd.Next(lst.Count); 
    int i2 = rnd.Next(lst.Count); 
    int tmp = lst[i1]; 
    lst[i1] = lst[i2]; 
    lst[i2] = tmp; 
} 
+0

इस तरह से यादृच्छिक तत्वों को स्वैप करना अच्छा यादृच्छिक वितरण नहीं देता है - मेरे उत्तर में लिंक के रूप में संग्रह को शफल करने का एक बेहतर तरीका है। –

+0

मुझे एहसास नहीं हुआ ... टिप के लिए धन्यवाद –

0
var seq = Enumerable.Range(0, 144);  
var all = seq.ToList(); 
var random = new Random(); 
var result = seq.Select(i => { 
var index = random.Next()%all.Count; 
var r = all[index] % 36 + 1; all.RemoveAt(index); 
return r; 
}).ToList();