在C#中生成并重复数字

时间:2010-01-07 11:31:37

标签: c# repeat enumerable

我想以随机顺序生成一个数字,其中包含来自1-> 36的144个数字(因此每个数字重复4次)。我们可以使用Enumerable.Repeat和Enumerable.Range来做到这一点。如果是,请向我解释如何?

4 个答案:

答案 0 :(得分:10)

好吧,创建包含所有数字的序列非常简单:

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

然后你可以使用ToArray将它放入一个数组并随机播放。有关在C#中对数组进行混乱的问题有很多问题,例如this one。您可以直接使用该代码,也可以调用ToArray并将数组移动到位,而不会在最后产生它。

答案 1 :(得分:0)

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

答案 2 :(得分: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;
}

答案 3 :(得分: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();