2010-01-07 30 views
5

Tôi muốn tạo một mảng có số 144 từ 1-> 36 theo thứ tự ngẫu nhiên (do đó, mỗi số được lặp lại 4 lần). Chúng ta có thể sử dụng Enumerable.Repeat và Enumerable.Range để làm điều đó. Nếu có hơn xin vui lòng giải thích cho tôi như thế nào?Tạo và lặp lại số trong C#

Trả lời

10

Vâng, tạo chuỗi với tất cả các số trong rất dễ dàng:

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

Sau đó, bạn chỉ có thể sử dụng ToArray để có được nó vào một mảng và xào bài. Có rất nhiều câu hỏi về việc xáo trộn một mảng trong C# trên SO, chẳng hạn như this one. Bạn có thể sử dụng mã đó trực tiếp, hoặc gọi ToArray và trộn các mảng vào vị trí mà không cần sử dụng nó ở cuối.

+0

hey, đó là dễ đọc hơn so Giải pháp của tôi. +1 –

+0

và thanh lịch hơn nhiều Concat của tôi;) –

+0

cảm ơn cho nhận xét, nhưng bây giờ tôi cần phải điền vào mảng tạo ra một mảng [9,16], bạn có thể đề xuất một cách tốt cho tôi? –

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

Có lẽ không quan trọng trong trường hợp này, nhưng cách xáo trộn này kết thúc là O (n log n), nơi nó chỉ cần là O (n). –

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

Việc hoán đổi các phần tử ngẫu nhiên theo cách này không tạo ra sự phân phối ngẫu nhiên tốt - có cách tốt hơn để xáo trộn một tập hợp, như được liên kết trong câu trả lời của tôi. –

+0

Tôi đã không nhận ra rằng ... cảm ơn cho tip –

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(); 
Các vấn đề liên quan