这是一种可能的解决方案:
说,你有一个这样的 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。
编辑:
基于 @mklement0 的 cmets 进行更新。上述内容并不准确,因为它并不总是提供与原始要求相匹配的团队规模。例如,对于 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