公平分组没那么简单——禁同组 / 必同组 / 属性均衡怎么实现,余数三种处理怎么选

· 约 5 分钟 👥 活动分组

“把这 30 个人分成 6 组”——听起来简单,真要分得让所有人都满意却很麻烦:这对情侣不能分一桌、这两个搭档得在一起、每组研发和产品的比例最好均匀、还有人数除不尽多出来的零头怎么办。

普通的”随机洗牌再切片”处理不了这些。活动分组就是为带约束的分组而生:粘名单、选模式、加约束,一键得到一份既满足所有硬性条件、又尽量均衡的方案。这篇讲清楚每个约束背后的机制,让你知道什么场景该怎么设。

先分清:这不是”随机抽签”

很多人把”分组”和”抽签”搞混,其实目标完全相反:

随机抽签活动分组
做什么从 N 个里挑出 K 个把 N 个全部分进 K 组
覆盖部分人所有人
典型场景点名、抽奖、做选择题分桌、分小组、配对
支持约束禁同组 / 必同组 / 均衡

只要你的需求是”每个人都得在某个组里”,并且带任何约束或均衡要求,就该用分组工具;纯粹”挑几个人出来”用 随机抽签 更直接。两者互补。

禁同组 / 必同组:硬约束怎么写

这是分组工具的核心能力——强制某些人凑一起、或强制错开。写法是每行一对或一组,逗号分隔:

约束写法含义
必同组张三,李四两人必须在同一组
必同组王五,赵六,孙七三人必须在同一组
禁同组张三,李四两人不能在同一组
禁同组周八,吴九,郑十三人两两都不能同组

必同组有个聪明的细节——传递合并。 用并查集(一种把”同类”不断合并的算法)处理:你写了 A,B 又写了 B,C,工具会自动推断 A、B、C 三人都得在同一组,不用你手动写全 A,B,C

冲突会被立即拦截:同两个人既写进必同组又写进禁同组(自相矛盾),或某个必同组单元的人数超过了你设的最大组容量(5 个人必须同组、但每组只能坐 4 个),工具直接报错,不会偷偷给你一个错误方案。

按属性均衡:软约束,尽量而非保证

想让每组的部门 / 性别 / 能力分布均匀,先在名单里给每个人带上属性。两种写法都认:

张三,部门=研发,性别=男      ← k=v 格式,可多个属性
李四,产品                   ← 简写,归到统一的"标签"属性

中英文逗号、中英文等号都识别。填了之后,“按属性均衡”下拉会自动列出所有出现过的属性键供你选。

关键认知:属性均衡是软约束,不是硬约束。算法跑最多 300 次随机分配,每次计算”该属性在各组的分布方差”,保留方差最小的那一次——尽量均匀,但不保证每组一模一样。

完美均衡需要同时满足:

  • 该属性每个值的总人数能被组数整除(8 男 8 女分 4 组 → 每组 2 男 2 女,可以完美)
  • 没有别的约束来打架

做不到完美的几种情况:

  • 除不尽:7 男 5 女分 4 组,必然有两组 2 男 1 女、两组 1 男 2 女
  • 禁同组锁死:禁同组把同属性的人强制分到不同组,均衡就被牵制
  • 必同组扎堆:3 个男生必同组,那一组注定男生偏多

结果区会显示不平衡度:0 是完美,数字越大越不均。觉得不理想就多点几次”重新洗牌”,看能不能碰到更低的分。

余数处理:17 人按每组 4 的三种解

只在”按每组人数”模式、且总人数除不尽时,才需要决定零头怎么办。以 17 人按每组 4 为例:

选项结果适用场景
均匀分配(默认)余数分散,每组最多差 1(如 4+4+4+5)课堂分组、一般团队
单独一组前几组装满,剩下自成一组(4+4+4+4+1)要明显区分”主组 + 散户”
抽掉把不够一组的人随机抽掉,全是满员组(4×4,抽掉 1 人)必须满员 / 必须配对

什么时候用”抽掉”?当”不满员就没法玩”的时候:Secret Santa 必须两两配对(奇数就得抽掉一人或自己补位)、淘汰赛抽签必须每组满员。其余日常场景一般”均匀分配”最自然。

三种典型场景速查

场景模式余数属性均衡约束
团建分桌 50 人 / 10 桌按组数 = 10均匀分配按”部门”必同组:夫妻;禁同组:上下级
班级分组 30 人 / 每组 5按每组人数 = 5均匀分配按”能力”(A/B/C)
Secret Santa 24 人 / 两两配对按每组人数 = 2抽掉(奇数时)禁同组:所有伴侣对

算法是怎么跑的、为什么每次不一样

理解了流程,就知道”重新洗牌”在干嘛:

  1. 必同组合并——并查集把所有”必须同组”的人合并成”单元”,单元内成员永远绑在一起移动。
  2. 重复随机分配——把单元随机洗牌,按组大小递减逐个填进还有空位的组,遇到禁同组冲突就跳过该组找下一个。
  3. 打分保最优——每次成功分配后算”指定属性的不平衡度”,跑满 300 次,保留分数最低的那次。

第 1 步洗牌的随机种子是 Math.random(),浏览器每次给不同种子,所以每次重洗探索到的解不同,结果自然不一样。只有当约束极紧、可行解寥寥时,才会反复落到同样的少数解上——那说明你已经摸到约束允许的最优了,再洗也变不出花。

导出与数据安全

分好后两种导出:

  • 复制:按”第 N 组(X 人)“排版的纯文本,直接粘到微信 / 飞书 / 钉钉群,对方原样看到。
  • CSV:带 UTF-8 BOM,Excel / WPS / Numbers 双击中文不乱码,列是组号 / 姓名 / 属性,可打印或继续加签到、菜品等列。

没有自带海报导出——要做分桌牌、签到墙,把 CSV 拿去 Canva 等工具排版即可。

数据全程不上传:名单、属性、约束只存在浏览器 localStorage 和当前页面,关标签页或清缓存即清除,刷新会自动恢复上次输入。处理团队真实名单、班级真实学生信息都不用担心泄露。性能上 500 人内毫秒返回,约束太紧会明确提示,放宽约束或加组数即可。

需要的是”挑几个人出来”而不是”全员分组”?那用 随机抽签做个决定 更顺手。分组工具专攻的是带约束、要均衡、要满覆盖这三件随机洗牌做不到的事。

❓ 常见问题

它跟"随机抽签"有什么区别?什么时候非用它不可?

随机抽签是从 N 个里挑 K 个,本工具是把 N 个全部分成 K 组,目标完全不同。非用本工具不可的场景:(1) 有约束——禁同组(情侣不同桌 / 同部门避免抱团)、必同组(搭档要一起);(2) 要均衡——按部门 / 性别 / 能力均匀分布;(3) 要满覆盖——所有人都得进某个组。只是"挑几个人出来"(课堂点名、年会抽奖)用随机抽签就够了,两者互补。

名字后面的属性怎么写?识别哪些格式?

两种写法都识别:(1) 名字,k=v,k=v 格式,如"张三,部门=研发,性别=男",工具自动收集所有出现过的属性键作为"按属性均衡"的下拉选项;(2) 名字,标签 格式,如"张三,研发",名字后面任何不带等号的内容都归到统一的"标签"属性下。英文逗号和中文逗号、英文等号和中文等号都识别。只在需要"按属性均衡"时才填属性,纯随机分组不用填。

必同组和禁同组怎么写?支持三个人以上吗?

每行一对或一组,逗号分隔。必同组写"张三,李四"表示两人必须同组,写"王五,赵六,孙七"表示这三人必须同组;工具用并查集传递合并——写了 A,B 和 B,C,会让 A/B/C 都进同一组。禁同组写"张三,李四"表示两人不能同组,写多人则两两都不能同组。如果同两人既在必同组又在禁同组,或某个必同组单元人数超过最大组容量,工具会立即报冲突。

按属性均衡是硬约束还是软约束?能保证每组完全一样吗?

软约束——尽量均匀,不保证完全一致。算法跑最多 300 次随机分配,每次算"该属性在各组的分布方差",保留方差最小那次。完美均衡要满足:该属性每个值的总人数能被组数整除(如 8 男 8 女分 4 组),且没有其他约束打架。除不尽(7 男 5 女分 4 组)、禁同组把同属性的人锁在不同组、必同组单元本身属性单一,都会导致无法完美。结果区会显示"不平衡度",0 是完美,可多点几次"重新洗牌"看能否更低。

余数处理三个选项怎么选?什么时候用"抽掉"?

只在"按每组人数"模式、且总人数除不尽时才有区别。均匀分配(默认):余数分散到几组,每组最多差 1 人。单独一组:前几组按指定人数装满,剩下的自成一组(可能只有 1 人)。抽掉:把不够凑一组的人随机抽掉,输出全是满员组。Secret Santa(必须两两配对)、淘汰赛抽签(必须满员)用"抽掉";课堂分组一般用"均匀分配";要明显区分"主组 + 散户"用"单独一组"。

数据会上传吗?最多支持多少人?

完全不上传,全部在浏览器本地运行。名单、属性、约束只存在浏览器 localStorage 和当前页面里,关标签页或清浏览器数据就消失,刷新会自动恢复上次输入。性能上:每次最多跑 300 轮,500 人内毫秒级返回;约束很松时上千人也能跑(1 秒内);约束极紧(大量必同组 + 禁同组互相牵制)时可能 300 轮都找不到完美方案,会提示"约束太紧",这时放宽几条约束或增加组数即可。

怎么导出分组结果?能直接发群里或打印吗?

两种导出:(1) 复制按钮——按"第 N 组(X 人)"格式排版的纯文本,粘到微信 / 飞书 / 钉钉群,对方原样看到完整分组;(2) CSV 按钮——下载带 UTF-8 BOM 的 CSV,Excel / WPS / Numbers 双击打开中文不乱码,列是组号 / 姓名 / 属性,可直接打印或继续加备注、菜品、签到列。没有自带海报导出,要做分桌牌就把 CSV 拿去 Canva 等排版。

为什么"重新洗牌"每次结果都不一样?

因为算法第一步给"单元"洗牌用的是 Math.random(),浏览器每次给不同种子,所以每次探索到的解不同,工具保留其中不平衡度最低的。只有在约束极紧、可行解很少时,才会反复落到同样的少数解上,那时多次重洗会看到几乎相同的结果——这说明已经接近约束允许的最优了。

👥 打开 活动分组 团建/班级/比赛分组·固定组数或每组人数·禁同组/必同组/属性均衡·重新洗牌·导出