I want to create an array that has 144 numbers from 1-> 36 in random order (so each number is repeated 4 times). Can we use Enumerable.Repeat and Enumerable.Range for this. If so, please explain to me how?
Well, creating a sequence with all the numbers in this is easy:
var items = from x in Enumerable.Range(1, 36) from y in Enumerable.Repeat(x, 4) select y;
ToArray, . # SO, . ToArray , .
ToArray
int[] numbers = Enumerable.Range(0, 144).Select(i => (i % 36)+1).OrderBy(g => Guid.NewGuid()).ToArray();
// 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; }
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();