是怎么分组的?
输入的名单先用 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%)。具体数字随环境而异,但偏斜是真实存在的。
常见错误
- 组数大于参与人数:会产生空组,工具会拒绝,请填不超过人数的值。
- 混淆“组数”和“每组人数”:20 人“每组 4 人”是 5 组,“分 4 组”则是每组 5 人。
- 启用组别均衡时组别名写法不一致:“A”和“A ”去掉空格后相同,但“A”和“A组”是两个不同的组别。
- 姓名里含逗号(如 "Kim, Jun"):开启组别均衡后,第一个逗号之后会被当作组别,请换一种写法。
局限与使用建议
- 随机不等于实力均衡。过程公平不代表各组实力相当;水平差距大时请用组别均衡。
- 不满意就重来,就不再是随机。看了结果再重抽,你的偏好就左右了结果。请事先定好次数,确定后用“复制结果”留档。
- 不支持“这两人必须分开/必须同组”之类的条件。若事后手动调换,请公开约定规则,并承认这已不是纯随机。
- 重名按不同的人处理。输入框下方会提示重名数量,请用“李明A/李明B”之类的方式区分。
隐私与相关工具
名单只在浏览器内处理,不会上传,也不会保存。不能指定随机种子,同一份名单每次点击结果都不同,无法复现;需要记录请复制结果。 只想抽 1 个人可以用随机数生成器,想用抽签的方式玩, 也可以试试爬梯子(阿弥陀籤)。
常见问题
用同一份名单再分一次,结果会变吗?
会。每次点击“开始分组”都会重新洗牌,同一份名单的结果也不同。反复抽到满意为止会破坏公平,建议只分一次并确定。
空行或重复姓名会怎么处理?
空行会被忽略。重复的姓名按不同的人处理,输入框下方会提示重名数量。
人数不能整除时怎么办?
各组人数最多相差 1 人。23 人分 4 组是 6、6、6、5 人,哪一组是 5 人同样随机。
能按水平相近来分组吗?
勾选“按组别均衡”,在每行写成“姓名, 高/中/低”之类的评级,评级会平均分散到各组。评级本身需要您自己确定。
最多能分多少组?
至少 2 组,至多为参与人数,上限 100 组。按每组人数分时组数自动计算,若不足 2 组会给出提示。
结果可以粘贴到别处吗?
点击“复制结果”,按组整理好的文本会进入剪贴板,可直接粘贴到聊天或文档中。