随机分组工具

每行输入一个姓名,设定分组数量(或每组人数),即可随机分组,各组人数最多相差 1 人。

是怎么分组的?

输入的名单先用 Fisher–Yates 洗牌算法打乱,再按打乱后的顺序像发牌一样依次分给第 1 组、第 2 组……第 k 组。 最后把组的顺序也再洗一次:如果多出来的人总是加在编号靠前的组,就会出现“第 1 组总是多一个人”的偏向, 所以连“哪一组多一个人”也交给随机。随机数来自浏览器的 crypto.getRandomValues,并用拒绝采样避免取模偏差 (极老的浏览器不支持时会退回 Math.random())。用于班级分组或活动分队绰绰有余,但Math.random() 不是安全用途的随机数,生成密码这类需要保密的内容请用密码生成器等专用工具。

人数不能整除时的规则

把 n 人分成 k 组,令 q 为 n÷k 的商,r 为余数,则r 个组有 q+1 人,其余 k−r 个组有 q 人。这已经是最均匀的分法, 哪些组多一个人由随机决定。选择“按每组人数分”时,组数取 n÷每组人数的向上取整,再按同样规则分配。 例如 11 人、每组 4 人,会分成 3 组,人数为 4、4、3,而且哪一组是 3 人也是随机的,并非固定最后一组。

人数 n组数 k人数构成指定两人同组的概率(参考)1/k
10人2组5人 × 2组44.44%50.00%
10人3组4人 × 1组 + 3人 × 2组26.67%33.33%
7人3组3人 × 1组 + 2人 × 2组23.81%33.33%
17人3组6人 × 2组 + 5人 × 1组29.41%33.33%
23人4组6人 × 3组 + 5人 × 1组21.74%25.00%
25人5组5人 × 5组16.67%20.00%
30人4组8人 × 2组 + 7人 × 2组22.53%25.00%
100人7组15人 × 2组 + 14人 × 5组13.43%14.29%

概率按“各组人数 s 的 s(s−1) 之和 ÷ n(n−1)”计算。因为各组人数是事先定好的,所以略低于每人独立选组时的 1/k: 一个人占了座位,同组剩下的座位就少了一个。

验算过的例子

例 1:23 人分 4 组。q=5,r=3,所以是 3 个 6 人组和 1 个 5 人组(6+6+6+5=23)。指定两人同组的概率为 (3×6×5 + 1×5×4) ÷ (23×22) = 110/506 = 21.74%。

例 2:10 人分 3 组。q=3,r=1,所以是 1 个 4 人组和 2 个 3 人组(4+3+3=10),同组概率为 (1×4×3 + 2×3×2) ÷ (10×9) = 24/90 = 26.67%。分法总数用多项式系数计算:6 人分成 3 个有编号的两人组是 6!/(2!×2!×2!) = 90 种,10 人分 3 组是 4,200 种。所谓公平,就是这些分法出现的概率完全相同。

按组别均衡模式

纯随机有时会让水平高的人或同一年级的人碰巧集中在一个组。勾选“按组别均衡”,每行写成张三, A 这样的“姓名, 组别”后,工具会把每个组别分别洗牌,再接着同一轮发牌顺序依次分配。 结果是每个组别在各组之间最多相差 1 人,各组总人数也最多相差 1 人。比如 A、B、C 各 4 人共 12 人分 4 组, 每组恰好是 A、B、C 各一人。没有逗号的行视为无组别。工具只保证“分散”,至于 A、B、C 的评级是否准确, 要由评级的人负责。

为什么不让每个人各自随机选组

最容易实现的做法是给每个人各抽一个 1 到 k 的随机数。但这样人数不会均匀:10 人分 2 组,恰好 5 比 5 的概率只有 C(10,5)/210 = 252/1024,约 24.6%,其余大多是 6 比 4、7 比 3 这类偏斜的结果。因此本工具先固定每组人数 (q 或 q+1),再把洗好牌的人依次填入座位。另外也不用 sort(() => Math.random() - 0.5) 这种一行式“洗牌”: 比较函数前后不一致,结果取决于运行环境的排序算法。在 Node.js 中把 3 个元素这样排 60 万次,某种顺序约占 37%, 另一种只有约 6%(公平时 6 种顺序都应是 16.7%)。具体数字随环境而异,但偏斜是真实存在的。

常见错误

局限与使用建议

隐私与相关工具

名单只在浏览器内处理,不会上传,也不会保存。不能指定随机种子,同一份名单每次点击结果都不同,无法复现;需要记录请复制结果。 只想抽 1 个人可以用随机数生成器,想用抽签的方式玩, 也可以试试爬梯子(阿弥陀籤)。

常见问题

用同一份名单再分一次,结果会变吗?

会。每次点击“开始分组”都会重新洗牌,同一份名单的结果也不同。反复抽到满意为止会破坏公平,建议只分一次并确定。

空行或重复姓名会怎么处理?

空行会被忽略。重复的姓名按不同的人处理,输入框下方会提示重名数量。

人数不能整除时怎么办?

各组人数最多相差 1 人。23 人分 4 组是 6、6、6、5 人,哪一组是 5 人同样随机。

能按水平相近来分组吗?

勾选“按组别均衡”,在每行写成“姓名, 高/中/低”之类的评级,评级会平均分散到各组。评级本身需要您自己确定。

最多能分多少组?

至少 2 组,至多为参与人数,上限 100 组。按每组人数分时组数自动计算,若不足 2 组会给出提示。

结果可以粘贴到别处吗?

点击“复制结果”,按组整理好的文本会进入剪贴板,可直接粘贴到聊天或文档中。