Kind of Lost Kind of Lost · Balanced Group Maker ·Google Sheets add-on ·AI assistants (MCP)

Balanced Classroom Group Generator — Not Random

Splits a class into groups that are fair on every trait you list — gender, reading level, language — keeps chosen students apart or together, and shows the balance it achieved. A real optimizer, not a shuffle.

Built for classroom groups; it works the same way for work teams. Free, no sign-up, and your list is not stored.

Laid out like the sample workbook: a people tab with a header row and a priority row (format explained below). No file yet? Download the sample, change the names, and upload it.

Number of groups
or
Smallest group
Largest group

Leave all three blank to use the workbook's settings tab. With a number of groups, sizes differ by at most one student; with a size range the tool tries every group count that fits and keeps the best balanced.

Takes a few seconds. Up to 300 people, 60 groups, 15 traits.

How to set up your file

One tab lists your people. The tool reads that layout, not an arbitrary spreadsheet, so start from the sample and replace its rows.

Row 1: the header. Column A is the person's name (each name once). Then one column per trait, plus the two optional rule columns, must be together and must be apart.
Row 2: the priority row. Starts with the word priority, then a number for each trait: 1 is the most important. Each step down counts four times less, ties are allowed, and a blank means lowest.
Together and apart codes. Students sharing a code are always in the same group (must be together) or always in different groups (must be apart). Codes can be numbers or words (1, 2, A, B), and a student can hold several, separated by commas.
Numbers vs categories. If every filled cell in a column is a number (a score, a level), each group's average is pulled toward the class average. Otherwise the column is categories (gender, language, club) and each value is spread across the groups in proportion to how common it is. Blank cells are fine.

An optional settings tab can hold groups, min size and max size so the file remembers its own setup. Here is the start of the sample's people tab (30 students in all):

studentmust be togethermust be apartgenderreading levelmath scorefirst languageclub
priority1223
Ava1female443Spanishchess
Liammale580Englishart
Sofia1female448Englishart
NoahAmale467Arabicband
Mia1female5Englishchess
Lucasmale370Spanishsoccer

Download the sample workbook

A worked example: the sample class in 6 groups

This is the result for the sample above (30 students, 6 groups), exactly as the tool returns it. Ava, Sofia and Mia share a must be together code and so sit in one group; Noah, Ethan and Leo share a must be apart code and land in three different groups. Gender has priority 1, reading level and math score priority 2, first language priority 3, and club none, so the tool trades a little of the lower-priority columns before it gives up any of the higher ones.

30 people in 6 groups of 5 people. Proven within 5% of the best possible grouping.

The groups

GroupSizeMembers
15Ava, Sofia, Mia, Jonas, Theo
25Liam, Chloe, Hugo, Aria, Marco
35Noah, Emma, Isla, Diego, Felix
45Lucas, Zoe, Leo, Ravi, Yara
55Ethan, Mateo, Nora, Ruby, Tess
65Omar, Kai, Lena, Priya, Nina

How balanced it is

TraitBalanced asPriorityBalance scoreLargest gap between a group and the class
gendercategories (proportional mix)1 80.0 0.5 (largest gap between a category's count in a group and its fair (proportional) count)
reading levelnumbers (equal averages)2 89.6 0.3667 (largest gap between a group average and the overall average)
math scorenumbers (equal averages)2 71.7 10.4074 (largest gap between a group average and the overall average)
first languagecategories (proportional mix)3 64.5 1.5 (largest gap between a category's count in a group and its fair (proportional) count)
clubcategories (proportional mix)lowest 76.0 1.28 (largest gap between a category's count in a group and its fair (proportional) count)

Balance score: 100 means every group mirrors the whole class exactly on that trait; 0 is the worst arrangement possible. Whole students can't be split, so 100 is often out of reach.

gender: each group against the class
GroupPeople countedfemalemale
1532
2523
3523
4523
5532
6532
Overall3015 (50%)15 (50%)
reading level: each group against the class
GroupPeople countedAverage
153.4
252.8
353.0
453.0
553.0
653.0
Overall303.0333
math score: each group against the class
GroupPeople countedAverage
1460.0
2573.0
3471.25
4571.0
5472.0
6573.6
Overall2770.4074
first language: each group against the class
GroupPeople countedSpanishEnglishArabicMandarin
151202
252300
352210
451301
551220
651202
Overall308 (27%)14 (47%)3 (10%)5 (17%)
club: each group against the class
GroupPeople countedchessartbandsoccer
152111
241111
331110
452111
530021
653101
Overall259 (36%)5 (20%)6 (24%)5 (20%)

How it's different from a random group generator

What it does not do: seating charts, tournament brackets, or rotating groups over several weeks.

Use it where you work

Google Sheets add-on: make the groups without leaving your class spreadsheet. MCP server: ask Claude or ChatGPT to make the groups and have this solver do the work.

FAQ

Is this really different from a random group generator?

Yes. A random generator shuffles names and hopes. This tool treats the grouping as an optimization problem: it searches for the arrangement where every group's mix of each trait you listed is as close as possible to the whole class's mix, and then shows you the numbers so you can check. Rules such as "keep these two apart" are never broken, which a shuffle cannot promise.

What can I balance?

Any column you add: gender, reading level, a test score, first language, a behaviour rating, a club. Text columns are spread across the groups in proportion to how common each value is. A column where every filled cell is a number is balanced by group average. You can list up to 15 columns, 300 people and 60 groups.

What if two things conflict, such as reading level and language?

The priority row decides. Priority 1 is the most important; each step down counts four times less, so the tool gives up a little of a lower-priority column before it gives up any of a higher one. Ties are allowed, and a blank priority means lowest.

How do I keep two students together, or apart?

Use the "must be together" and "must be apart" columns. Students who share a code are always in the same group (together) or always in different groups (apart). Codes can be numbers or words, and a student can have several, separated by commas. These are rules, not preferences.

Can the groups have different sizes?

Give a number of groups and the sizes differ by at most one student (30 students in 6 groups is 5 each; 31 is five groups of 5 and one of 6). Or give a minimum and/or maximum size and the tool tries every group count that fits and keeps the best balanced one.

What if it says the groups can't be perfectly balanced?

Whole students cannot be split: five students can never be 40 percent of anything. The balance table shows how close the groups got on each trait, from 100 (every group mirrors the class exactly) toward 0 (the worst possible arrangement). Often 100 is not reachable and the optimizer's answer is the closest there is.

Does it keep my student list?

No. The file is read, solved and discarded; the result you download is built in the request and not stored. See the privacy policy. You do not need real names: first names or initials work.

Does it make seating charts, brackets or round-robin schedules?

No. It splits a list into groups. It does not lay out seats, build tournament brackets, or rotate groups over several weeks.

Is it free?

Yes, with no sign-up. It runs a real optimization solver on a small server, so it solves one problem at a time and rate-limits heavy use.