names = ["Aaron", "Nick", "Ben", "Bob", "Ted", 'shiva', 'hari', 'subash'] number_of_teams = 4 players_per_team = (names.count / number_of_teams.to_f).ceil teams = [] (1..number_of_teams).each do |num| teams[num - 1] = names.sample(players_per_team) names = names - teams[num - 1] end > p teams => [["hari", "Ben"], ["Bob", "subash"], ["shiva", "Ted"], ["Nick", "Aaron"]]
and if
names = ["Aaron", "Nick", "Ben", "Bob", "Ted", 'hari', 'subash']
then
> p teams [["hari", "subash"], ["Bob", "Aaron"], ["Ben", "Nick"], ["Ted"]]
Note: this will result in random players with every shuffle
source share