如何均匀分布数组成员

时间:2014-04-18 19:35:57

标签: c#

我有一个Boxes数组和一个Cats数组。我需要将猫均匀地分配到盒子里 我目前的代码是:

Cat[] Cats = GetCats();
Box[] Boxes = GetBoxes();

int baseCatsPerBox = Cats.Length / Boxes.Length
int boxesWithOneExtraCat = Cats.Length % Boxes.Length

int boxIndex = 0;
foreach(Cat c in Cats)
{
    Boxes[boxIndex].Cats.Add(c);
    int catsInThisBox = baseCatsPerBox;
    if (boxIndex < boxesWithOneExtraCat)
        catsInThisBox++;
    if (Boxes[boxIndex].Cats.Count == catsInThisBox)
        boxIndex++;
}

此代码主要适用。如果我插入7盒子和10猫,我会得到:

2-2-2-1-1-1-1

我想要一种方法来做一个更均匀的分布(带有额外猫的盒子均匀分布),如下所示:

2-1-1-2-1-1-2

将一系列猫分配到一系列盒子中的最优雅(最少的代码行)方式是什么?

2 个答案:

答案 0 :(得分:2)

试试这段代码:

int cats = 10;
int boxes = 7;
int[] result = new int[boxes];

double catsPerBox = (double)cats / boxes;
int index = 0;
double currentCats = 0;
int oldCats = 0;
while (index < boxes)
{
    currentCats += catsPerBox;
    int intCats = (int)Math.Round(currentCats - oldCats);
    oldCats += intCats;
    result[index++] = intCats;
}

它为cats = 10数组中的boxes = 7result生成以下&#34;偶数&#34; 分布:

1-2-1-2-1-2-1

答案 1 :(得分:0)

GroupByEnumerable.Aggregate之后的{p> (int)(catIndex/floatPerBox将为您提供一个语句选项:

// Note: float here to get floating number division
float catsPerBox = cats.Count()/(float)boxes.Count();
cats
   .Select((value,index) => new {value, index})
   .GroupBy(x=> (int)(x.index/catsPerBox), x=>x.value)
   .Aggregate(
      boxes,
      (_,s)=> { boxes[s.Key]=s.ToArray(); return boxes; }
    );