Paste a roster and split it into fair, random, size-balanced groups or teams — for group projects, breakout rooms, sports, standups and events. Unbiased crypto shuffle, built in your browser.
Blank lines and surrounding spaces are dropped automatically. Two people can share a name, so duplicates are kept by default.
Off by default — only turn on if a repeated name is genuinely the same person entered twice.
Saves your list in this browser (localStorage) so you don't re-type it next session. Never uploaded.
Cosmetic only — labels never change the math.
This free random team generator takes a list of names (a class roster, a meeting attendee list, a sports squad) and splits it into fair, random, size-balanced groups. Choose how many groups you want — or how many people per group — and it deals everyone out with a provably unbiased shuffle. Save your roster on the device, reshuffle in one click for a fresh draw, and copy or download the result as CSV. Everything runs in your browser; nothing is uploaded.
You have a class of 23 students and want 5 breakout rooms. Set mode to
Number of groups, G = 5. With N = 23: base = floor(23 / 5) = 4 and
rem = 23 mod 5 = 3. So the first 3 groups get 4 + 1 = 5 members and the
remaining 2 groups get 4 members → sizes 5, 5, 5, 4, 4 (total 23,
nobody lost or duplicated). The headline reads "23 names → 5 groups of 4–5". Switch to People per group
with S = 5 and you'd get G = ceil(23 / 5) = 5 — the same five groups, rebalanced to 5, 5, 5, 4, 4
rather than a lonely 5, 5, 5, 5, 3.
sort(() => Math.random() - 0.5) trick — that is measurably biased.crypto.getRandomValues (a CSPRNG) with rejection sampling: we discard the top non-uniform slice of the 32-bit range so every index is exactly equally likely. This is stronger than Math.random(), which is seed-predictable and slightly biased toward low values under naive modulo.base = floor(N / G) and rem = N mod G, the first rem groups get base + 1 members and the rest get base. That is the mathematically fairest integer split.G = ceil(N / S) first, then redistribute with the same floor + remainder rule — so 16 people at S = 5 become 4, 4, 4, 4, never 5, 5, 5, 1.Embeddable in one line — copy the ready-made snippet from the box below.
An unbiased Fisher–Yates shuffle using crypto.getRandomValues with rejection sampling (no modulo bias), then the shuffled list is sliced into groups. Every person is equally likely to land in any group.
Yes — when the roster doesn't divide evenly, sizes differ by at most 1 (e.g. 23 into 5 → 5,5,5,4,4). It's balance by size only, not by skill, gender, or prior teammates.
Yes, if "Keep roster on this device" is on (default). It's saved in your browser's localStorage — no account, never uploaded. Turn it off any time.
Kept by default, since two real people can share a name. You get a non-blocking notice, and an optional "Remove duplicate names" toggle if they're truly the same person.
Yes — extra groups are shown explicitly as empty (0 members) with a notice, rather than hidden. No name is ever lost or duplicated.
Yes — 100% free and fully client-side. Your roster never leaves the browser; the optional 'keep roster' setting uses localStorage on your own device.
🔒 Your roster is split in your browser and saved only there (if you choose). We don't store or sell your data.