如何将项目添加到C#数组中,使每个项目正好有3个?

如何将项目添加到C#数组中,使每个项目正好有3个?,c#,arrays,C#,Arrays,我有一个长度为12的int数组[],我想用0到3的数字随机填充它,但我想确保数组中正好有0、1、2和3中的三个。有什么办法吗?你可以从有序数组(如0,0,0,1,1,1…等)开始,然后进行洗牌,比如洗牌。检查每个索引,并用另一个随机索引的内容交换内容。非随机填充,然后随机移动: int[] myArray = new int(12); for (i = 0; i < 12; ++i) { myArray[i] = i/3; } Random rnd = new Random();

我有一个长度为12的int数组[],我想用0到3的数字随机填充它,但我想确保数组中正好有0、1、2和3中的三个。有什么办法吗?

你可以从有序数组(如0,0,0,1,1,1…等)开始,然后进行洗牌,比如洗牌。检查每个索引,并用另一个随机索引的内容交换内容。

非随机填充,然后随机移动:

int[] myArray = new int(12);
for (i = 0; i < 12; ++i)
{
    myArray[i] = i/3;
}

Random rnd = new Random();
for (i = 0; i < 12; ++i)
{
    //int swapWith = rnd.Next(12);
    // Corrected to avoid bias.  See comments.
    int swapWith = rnd.Next(i+1);
    int temp = myArray[i];
    myArray[i] = myArray[swapWith];
    myArray[swapWith] = temp;
}
int[]myArray=newint(12);
对于(i=0;i<12;++i)
{
myArray[i]=i/3;
}
随机rnd=新随机();
对于(i=0;i<12;++i)
{
//int swapWith=rnd.Next(12);
//更正以避免偏见。请参阅注释。
int swapWith=rnd.Next(i+1);
int temp=myArray[i];
myArray[i]=myArray[swapWith];
myArray[swapWith]=温度;
}

填充数组,然后洗牌数字。您可以在这里找到如何进行洗牌:

这里的一些其他答案建议您只需交换随机选择的元素。这不会产生真正随机的结果。有关随机排序的详细原因和更好的方法,请参见此处:

这里还有一种方法

        var rnd = new Random();
        var items = Enumerable.Repeat(Enumerable.Range(0, 4), 3).SelectMany(item => item).OrderBy(item => rnd.Next()).ToArray();

你到底想用这个数组的结果实现什么?设置文本框的颜色。[0是红色的,1是绿色的,2是蓝色的,3是黑色的…]它可能更具语义,但无论如何,这个项目都很粗糙。听起来像是家庭作业。如果是这样的话,你应该给它贴上这样的标签。+1其他答案也是正确的,但是你写的代码大约是45秒+1的原则,但是你的洗牌实现不是真正的Fisher-Yates-Durstenfeld洗牌,并且会表现出一些偏见:参见和的“实现错误”部分的第二段。@LukeH:谢谢。我是用(有毛病的)记忆打出来的。现在修好了。
        var rnd = new Random();
        var items = Enumerable.Repeat(Enumerable.Range(0, 4), 3).SelectMany(item => item).OrderBy(item => rnd.Next()).ToArray();