Разбиение команд на 6 групп по 4 в каждой

125
23 декабря 2020, 22:00

Пытался сделать, но ввиду while, долго думает программа и вообще наверное способ мой плохой.

public static void SplitTeamsByGroups()
{
    var rnd = new Random();
    var groupNumber = 0;
    var i = 0;
    while (i < TeamsCount)
    {
        groupNumber = rnd.Next(0, GroupsCount);
        if (Groups[groupNumber].Count < TeamsInGroupCount)
        {
            Groups[groupNumber].Add(Teams[i]);
            i++;
        }
    }
}

TeamsCount = 24

GroupsCount = 6

TeamsInGroupCount = 4

Groups - массив из списков List из 6 элементов

Teams - массив string из 24 элементов

В общем пытаюсь сгенерировать рандомно номер группы и если позволяет размер группы(<4) засунуть туда команду, иногда работает даже, но потом начинает генерироваться постоянно 0,1,2,3 в GroupNumber, а остальные цифры нет, отладчиком пробегался

Может кто подскажет более рациональный способ или с этим что-то сделать можно

Answer 1

Заполните массив числами от 1 до 24 (или 0..23, в общем - номерами команд)

Перемешайте его с помощью алгоритма Фишера—Йетса

 для всех i от n − 1 до 1 выполнить
       j ← случайное число 0 ≤ j ≤ i
       обменять местами a[j] и a[i]

Затем каждые 4 последовательных элемента отнесите к соответствующей группе (группа номер i/4)

for (i=0; i<24;i++)
   Groups[i/4].Add(A[i]);
Answer 2

Создаем команды

var teams = Enumerable.Range(1, 24).Select(x => $"Team number {x}").ToArray();

Количество групп

var groupCount = 6;

Перемешиваем и группируем

var random = new Random();  
var grouped = teams
        .OrderBy(x=>random.Next(teams.Length))
        .Select((x, i) => (x, i))
        .GroupBy(item => $"Group number {(item.i % groupCount)+1}", item=>item.x);

Выводим результат

foreach(var group in grouped)
{
    Console.WriteLine(group.Key);
    foreach(var team in group)
    {
        Console.WriteLine($"\t{team}");
    }
}   

Вывод

Group number 1
  Team number 8
  Team number 6
  Team number 19
  Team number 9
Group number 2
  Team number 20
  Team number 7
  Team number 16
  Team number 22
Group number 3
  Team number 1
  Team number 11
  Team number 4
  Team number 24
Group number 4
  Team number 18
  Team number 3
  Team number 17
  Team number 14
Group number 5
  Team number 13
  Team number 15
  Team number 12
  Team number 2
Group number 6
  Team number 23
  Team number 10
  Team number 21
  Team number 5
READ ALSO
Окно поверх других WinApi, C#

Окно поверх других WinApi, C#

Всем привет, автоматизирую программу для клиентаТ

169
Перезапись xml файла на c#

Перезапись xml файла на c#

Добрый день подскажите пожалуйста как изменить один из элементов xml файла и перезаписать, вот код

187
Rijndael ошибка инициализации вектора iv

Rijndael ошибка инициализации вектора iv

Не могу изменить ключ для шифрования и расшифровки пишет ошибку:

165