Вот одно из возможных решений:
Скажем, у вас есть CSV, как это:
Player
David
Mary
Thomas
Alice
Michael
Gordon
Gary
Hannah
Sally
Richard
Colin
Emma
Paige
John
Alex
Тогда вы можете получить несколько случайных команд из этого следующим образом:
$players = Import-Csv .\players.csv
$teamSize = 3
$maxTeams = [math]::Floor($players.Count/$teamSize)
$teams = @{}
$shuffled = $players | Get-Random -Count $players.Count
$shuffled |
ForEach-Object { $i = 0 }{
$teams["$($i % $maxTeams)"] += @($_.Player)
$i++
}
Это приводит к хеш-таблице, подобной этой:
Name Value
---- -----
0 {Alice, David, Mary}
1 {Gordon, Colin, John}
2 {Emma, Paige, Thomas}
3 {Alex, Hannah, Richard}
4 {Sally, Michael, Gary}
Настройте $teamSize
, если вам нужно больше или меньше игроков в каждой команде.
EDIT:
Обновление на основе комментариев @ mklement0. Вышесказанное не является точным в том смысле, что оно не всегда дает размеры команды, соответствующие исходным требованиям. Например, для списка из 22 игроков:
TeamSize Teams
-------- -----
1 1 x22
2 2 x11
3 3 x6 / 4 x1
4 4 x3 / 5 x2
5 5 x2 / 6 x2
6 7 x2 / 8 x1
7 7 x2 / 8 x1
8 11 x2
9 11 x2
Это, однако, производит более равномерно сбалансированные команды, если $teamSize
не слишком близко к половине общего количества. Например, при строгом размере команды 5 у вас будет 4 команды по 5 и 1 команда из 2, что может быть слишком большим несовпадением в зависимости от сценария, но это дает 2 команды по 5 и 2 из 6, что может быть «справедливее».
В любом случае, улучшения @ mklement0 обеспечивают более строгое соблюдение этого требования. Вот код для этого:
$players = Import-Csv .\players.csv
$teamSize = 3
$maxTeams = [math]::Ceiling($players.Count/$teamSize)
$teams = @{}
$shuffled = $players | Get-Random -Count $players.Count
$shuffled |
ForEach-Object { $i = 0 }{
$teams["$([Math]::Floor($i / $teamSize))"] += @($_.Player)
$i++
}
Для сравнения, вот команды, которые это производит:
TeamSize Teams
-------- -----
1 1 x22
2 2 x11
3 3 x7 / 1 x1
4 5 x4 / 2 x1
5 5 x4 / 2 x1
6 6 x3 / 4 x1
7 7 x3 / 1 x1
8 8 x2 / 6 x1
9 9 x2 / 4 x1