👥 Random Group Generator
Paste a name list, choose group count or members per group, and get fair random groups instantly
Separate names with newlines or commas
Why the Shuffle Algorithm Matters
Most quick-and-dirty grouping scripts shuffle with list.sort(() => Math.random() - 0.5). That's famously broken: sort algorithms assume a consistent comparator, and feeding them coin flips produces permutations that are not equally likely — some people measurably drift toward the front groups. This tool uses the Fisher–Yates shuffle (popularized in Knuth's The Art of Computer Programming): walk the list backwards, swapping each element with a uniformly random earlier position. Every one of the n! orderings comes out exactly equally probable, so no name has any edge toward any group.
After shuffling, members are dealt round-robin into groups, which is what keeps sizes balanced: 10 people into 3 groups always lands as 4+3+3, never 8+1+1. Each click of Generate is an independent shuffle with no memory — re-roll as many times as you like, ideally on a projector where everyone can watch. Transparency is the point: nobody can accuse the facilitator of stacking teams.
Group Size: What Actually Works
Research on cooperative learning and team dynamics keeps converging on the same numbers — beyond a certain size, social loafing sets in and quiet members disappear:
| Setting | Sweet spot | Why |
|---|---|---|
| Class discussion | 4–6 | Everyone speaks; enough hands to divide the work |
| Icebreakers | 3–4 | Small enough that introverts can't hide behind extroverts |
| Project teams | 3–5 | Clear ownership; free-riding is visible |
| Workshops / breakouts | 5–8 | Diverse viewpoints without needing a moderator |
| Competitions | even split | Fairness beats any "ideal" number |
Use "Per Group" mode to enforce a size cap, but note the last group takes the remainder (10 people at 3 per group → 3+3+3+1). If a lone-member group is a problem, switch to "Total Groups" mode so the remainder spreads out (4+3+3).
Balanced Groups from a Pure-Random Tool
Pure randomness occasionally puts all your strongest participants in one team. When you need heterogeneous grouping — mixed skill levels, mixed departments, mixed genders — layer a stratified pass on top:
- Split your roster by the balancing criterion (e.g., experienced vs. new hires).
- Run each subset through the tool separately with the same group count.
- Merge by index: subset A's Group 1 joins subset B's Group 1, and so on.
Every group ends up balanced on your criterion while membership within each stratum stays random. For "these two can't be together" constraints, the tool deliberately has no exclusion rules — rules erode the visible fairness that makes live shuffling persuasive. Just re-roll, or swap two names by hand afterwards.
Frequently Asked Questions
What's the difference between the two modes?
"Total Groups": you fix the number of groups and people are spread as evenly as possible (sizes differ by at most one). "Per Group": you fix the maximum group size and the number of groups follows — with any remainder forming a smaller final group.
Is the name list uploaded anywhere?
No. Shuffling and rendering happen entirely in your browser — participant names never leave your device, which matters when the roster is a class list or employee directory.
How many names can it handle?
There's no hard cap; hundreds of names group instantly. For very large events, just make sure the format is clean — one name per line, or comma-separated — before pasting.
Can I export the results?
Results render as cards: screenshot them, select-and-copy the text, or print to PDF with Ctrl+P. There's no session history — if you need this week's groups to differ from last week's, save each result and re-roll on collisions.