使用方法
- 把名单粘进左侧文本框,每行一个名字,示例是十个人。回车的行为是换行,要开始分组请按 Ctrl 或 Cmd 加回车,避免把换行当成提交。
- 「分组方式」选「按组数」时填想分几组,示例 3 组;选「每组人数」时填每组最多几人,示例 4 人,程序会自己算出需要几组。
- 「随机种子」默认 20261016,可改成 1 到 2147483646 之间的任意整数。种子相同、名单相同,得到的结果一定相同。
- 点「重新分组」或改动任一控件都会立即重算;换一个种子就换一套排列,名单不动也能反复重排。
- 结果区先给出人数、组数与每组人数分配,下方卡片逐组列出成员,再下方是把全部名字按序号排开的明细表。
- 明细表默认展开六行,「加载更多」展开其余,「复制对照表」取制表符文本,「导出 CSV」下载带字节序标记的文件。
这个随机分组生成器能解决什么问题
这个随机分组生成器针对的是「把一群人公平地分成几摊」这种反复出现的场景:课堂上分小组、比赛抽签分边、值班排班、团建分桌。它的重点不在「随机」两个字,而在「可复算」与「可公示」——分组结果一旦能被独立复现,任何人拿着同一份名单与同一个种子都能重新跑出同一份结果,就不必再争论某个人是不是被塞进了哪个组。
同类里的几个兄弟页方向不同:是非选择器只对一个命题出「是」或「否」,随机顺序生成器把一份名单排成一个整体顺序、不切块,随机动物生成器与随机城市生成器从内置词表里取名,而打乱行工具只做洗牌、不做等分。本页在洗牌之后还多做一步「按人数切片」,这才叫分组。
计算原理与变量说明
设名单里有效名字共 N 个,要分成 K 组。本页先用一个线性同余发生器从种子出发生成随机序列,再用它驱动一次整表洗牌,最后把洗好的序列按每组人数切开,分两步走:
- 随机源:
s = (Math.imul(s, 1103515245) + 12345) & 0x7fffffff,每一步把当前值乘 1103515245、加 12345,再截取低 31 位。 - 洗牌下标:
j = Math.floor(s / 2147483647 * (i + 1)),i 从 N 减 1 递减到 1,把第 i 个与第 j 个交换,这就是 Fisher 与 Yates 的原地洗牌。 - 组大小分配:
base = floor(N ÷ K),extra = N mod K,前 extra 组各多分 1 人,其余组各 base 人。 - 切片:按上面算出的组大小,从洗好的序列头部往后切,切出的每一段就是一组,天然保证一人只出现在一组里。
- 每组人数模式:给定每组上限 m 时,
K = ceil(N ÷ m),先算出组数,再走与上面完全相同的洗牌与切片流程。
一、公平分组的核心是洗牌的均匀性,不是「随便抽一个」。 常见的错误做法是每一组各自从名单里随机取人,取到的先从池子里划掉。这种做法看着随机,实际会让人被抽到的先后顺序影响分布,某些人明显更容易落在靠前的组。正确做法是先把整张表洗一次,让每个排列出现的概率相同,再机械地切片——把随机性集中在洗牌这一步,后面的切分完全确定。
二、用种子加线性同余是为了可复现,这与系统随机数是两套语义。 浏览器内置的随机源每次调用都不同,无法复现;本页改用「种子乘 1103515245 加 12345、再取低 31 位」的固定序列,同一个种子必然走出同一条序列,同一份名单永远得到同一份分组。要换一批结果,改种子即可。这套序列的取值落在 0 到 2147483647 之间,再除以该上限映射到区间,才能当洗牌下标。
三、名单不能整除组数时必然有组多 1 人,规则固定才不会有人质疑。 十个名字分三组,3 乘 3 等于 9,还差 1 个,于是有一组是 4 人、另两组是 3 人。本页把多出来的 1 人分给编号靠前的组,也就是第一组,写死这条规则比每次都换一种分法更让人服气。同理,十个名字分六组会自动得到 2、2、2、2、1、1,先满足前面的组。
四、同一个人反复被抽会直接违反一人一组,必须先洗牌再切片。 若不加约束地反复抽取,一个人可能同时出现在两个组里,事后还得手动去重。整表洗牌保证每个名字在洗好的序列里只出现一次,切片只是在一条不重复的序列上划线,从根上杜绝了重复。这也是算法顺序不可颠倒的原因:先洗牌、再算组大小、后切片。
完整示例(数值仅作演示)
示例条件:十人名单(张伟、王芳、李娜、刘洋、陈静、杨帆、赵磊、黄敏、周涛、吴婷),种子 20261016,按 3 组。结果由本页的洗牌与切片算法复算得到。
- 组大小:10 除以 3 得 3 余 1,所以前 1 组多 1 人,三组人数依次是 4、3、3。
- 洗牌后的完整顺序:赵磊、李娜、黄敏、周涛、王芳、吴婷、张伟、杨帆、刘洋、陈静。
- 第 1 组:赵磊、李娜、黄敏、周涛,正好 4 人,对应前 1 组多出来的那个名额。
- 第 2 组:王芳、吴婷、张伟,3 人。
- 第 3 组:杨帆、刘洋、陈静,3 人。
- 换成「每组最多 4 人」:组数等于 10 除以 4 向上取整,得 3 组,人数仍是 4、3、3,与按 3 组的结果一致。
- 名单加到十二人(末尾追加徐明、孙倩)按 5 组:组大小是 3、3、2、2、2,第 1 组为孙倩、王芳、周涛。
- 只换种子不换名单:seed 1 的第一组是周涛、赵磊、陈静、黄敏,seed 42 的第一组是周涛、黄敏、赵磊、王芳。
把同样的名单与种子填进工具区即可得到相同结果,示例数值均为演示。
组大小分配与种子复现对照表
下表是十个名字在不同组数下的组大小分配,靠前的组先拿到多出来的名额,规则只有这一条。
| 组数 K | 组大小 | 说明 |
|---|---|---|
| 2 | 5、5 | 能整除,两组等分 |
| 3 | 4、3、3 | 前 1 组多 1 人 |
| 4 | 3、3、2、2 | 前 2 组各多 1 人 |
| 5 | 2、2、2、2、2 | 能整除,五组等分 |
| 6 | 2、2、2、2、1、1 | 前 4 组各多 1 人 |
下表把同一份十人名单换四个种子,只列出第一组,用来演示「名单不动、种子一换结果就换」。
| 随机种子 | 第 1 组 |
|---|---|
| 20261016 | 赵磊、李娜、黄敏、周涛 |
| 1 | 周涛、赵磊、陈静、黄敏 |
| 42 | 周涛、黄敏、赵磊、王芳 |
| 2026 | 赵磊、周涛、李娜、黄敏 |
下表是第二个完整示例:十二人名单(在十人基础上追加徐明、孙倩)按 5 组、种子 20261016 的逐人明细,组大小为 3、3、2、2、2。这张十二行的明细由本页算法复算得到,可以逐条核对。
| 序号 | 姓名 | 所属组 |
|---|---|---|
| 1 | 孙倩 | 第 1 组 |
| 2 | 王芳 | 第 1 组 |
| 3 | 周涛 | 第 1 组 |
| 4 | 徐明 | 第 2 组 |
| 5 | 赵磊 | 第 2 组 |
| 6 | 吴婷 | 第 2 组 |
| 7 | 李娜 | 第 3 组 |
| 8 | 杨帆 | 第 3 组 |
| 9 | 张伟 | 第 4 组 |
| 10 | 黄敏 | 第 4 组 |
| 11 | 刘洋 | 第 5 组 |
| 12 | 陈静 | 第 5 组 |
读表要抓两点。一是四个种子给出的第 1 组完全不同,说明种子直接决定洗牌结果,而组大小规则始终不变。二是十二人那一例里第 3 组只有 2 人,因为 12 除以 5 得 2 余 2,只有前 2 组拿到 3 人,与前面「前 extra 组各多 1 人」的规则对应。
结果边界、舍入与适用说明
- 名单为空时给出「请先在左侧填写名单,每行一个名字」的提示;只有 1 个有效名字时提示至少需要 2 个名字才能分组。
- 名字按行切分并去掉首尾空格,空行会被忽略,从表格里粘一列名字也能直接用。
- 按组数模式下组数至少为 2,且不能超过名字数量;十个名字最多分十组,此时每组恰好 1 人。
- 按每组人数模式下每组至少 1 人,组数由名字数除以每组人数向上取整得到。
- 随机种子允许 1 到 2147483646;填 0 或负数会提示「随机种子请填 1 以上的整数」,不会套用上一次结果。
- 分组结果完全由种子与名单决定,与设备、浏览器、时间无关,在任何机器上复算都得到同一份结果。
- 本页每次只保留最近一次分组结果,刷新或重置会回到默认的十人名单、3 组、种子 20261016。
- 同名的两个人会被当成两个不同的个体参与洗牌,输出里不会标注谁是谁,需要区分时请在名字后加编号。
常见问题
为什么同一个种子每次分组结果都一样?
因为随机序列由种子驱动,用的是固定公式 s 等于 s 乘 1103515245 加 12345 再取低 31 位,没有引入时间或系统随机源。种子相同,走出的序列就相同,洗牌与切片自然一致。想要每次都不同,换个种子即可。
为什么按组数分不匀,总有一组多一个人?
当名字数不能整除组数时,平均数不是整数,必然有组多 1 人。十个名字分三组,每组 3 人只能装下 9 个,剩下 1 个只能放进其中一组。本页把多出来的人分给编号靠前的组,规则固定,第一组优先拿到。
「按组数」和「按每组人数」有什么区别?
前者你定的是分几组,人数由名字数除以组数得到;后者你定的是每组最多几人,组数由名字数除以每组人数向上取整得到。两种模式最终都走同一套洗牌与切片。
换种子会打乱已经分好的组吗?
会。种子是洗牌的起点,换一个种子就得到一条全新的洗牌序列,切片后每个组的人都会重新组合。名单不变时,种子是唯一能改变结果的开关,想换一批分组只要改种子即可。
名单里能放数字、空格或英文吗?
可以。每一行按名字原样处理,去掉首尾空格后作为一个个体参与洗牌,数字与英文同样适用。空行会被忽略,从电子表格里复制一整列贴进来也能直接用。
结果是真随机还是可预测的?
是可复现的伪随机。它由种子确定,不是系统随机源,所以同一个种子必然得到同一份结果,这正是公平公示要的性质。它的分布足够均匀,但不能用于密码、抽奖兑奖这类需要不可预测性的场景。
这个工具免费吗?
免费,无需注册即可使用。
输入的数据安全吗?
安全。计算在当前浏览器本地完成,不会上传输入内容。