C# 在C中生成并重复数字#

C# 在C中生成并重复数字#,c#,repeat,enumerable,C#,Repeat,Enumerable,我想生成一个数组,它有144个从1->36的随机顺序的数字(所以每个数字重复4次)。我们可以使用可枚举。重复和可枚举。范围来完成吗。如果是,请向我解释如何进行?那么,创建包含所有数字的序列很容易: var items = from x in Enumerable.Range(1, 36) from y in Enumerable.Repeat(x, 4) select y; 然后您可以使用ToArray将其放入数组并洗牌。在C#on SO中洗牌数

我想生成一个数组,它有144个从1->36的随机顺序的数字(所以每个数字重复4次)。我们可以使用可枚举。重复和可枚举。范围来完成吗。如果是,请向我解释如何进行?

那么,创建包含所有数字的序列很容易:

var items = from x in Enumerable.Range(1, 36)
            from y in Enumerable.Repeat(x, 4)
            select y;
然后您可以使用
ToArray
将其放入数组并洗牌。在C#on SO中洗牌数组有很多问题,例如。您可以直接使用该代码,也可以调用
ToArray
并将数组洗牌到位,而不会在最后生成该数组。

//生成列表(不是以随机顺序)
int[] numbers = Enumerable.Range(0, 144).Select(i => (i % 36)+1).OrderBy(g => Guid.NewGuid()).ToArray();
var one_至_36=可枚举范围(1,36); var lst=one_to_36.Concat(one_to_36).Concat(one_to_36).Concat(one_to_36).ToList(); //通过交换随机元素将列表随机化 随机rnd=新随机(); 对于(int i=0;i
比我的多个Concat;)更优雅谢谢你的评论,但现在我需要将生成的数组填充为[9,16]数组,你能给我建议一个好方法吗?@一只新鸡:我怀疑使用Buffer.BlockCopy对你有用。。。无论如何,这是值得一试的。(即,创建2D数组并使用Buffer.BlockCopy将1D数组复制到其中。)以这种方式交换随机元素不会产生良好的随机分布-有一种更好的方法可以洗牌集合,如我的答案中所链接的。在这种情况下,可能不重要,但这种洗牌方式最终是O(n log n),而它只需要是O(n) 。
// 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();