*张三 标为队长候选,算法保证每组分到一个 ·
张三,部门=研发 后续可按部门均衡
k=v 属性后可勾选多项 活动分组 是一个面向”团建分桌 / 班级分小组 / 比赛分组 / Secret Santa”的随机分组工具——粘贴名单、选好分组模式(固定组数 或 固定每组人数)、加上必要的约束(禁同组 / 必同组 / 按属性均衡),一键得到一份满足约束的合理分配。
普通”随机洗牌再切片”做不到的几件事:
把这些条件一股脑塞进算法,工具会自动跑最多 300 次随机分配,挑出”既满足约束、又把属性分布最均衡”的那一次。
| 场景 | 模式 | 余数 | 属性 | 约束 |
|---|---|---|---|---|
| 团建分桌 50 人 / 10 桌 | 按组数 = 10 | 均匀分配 | 按 “部门” 均衡 | 必同组:夫妻;禁同组:上下级 |
| 班级分小组 30 人 / 每组 5 | 按每组人数 = 5 | 均匀分配 | 按 “能力” 均衡(A/B/C) | — |
| Secret Santa 24 人 / 两两配对 | 按每组人数 = 2 | 抽掉(如果是奇数) | — | 禁同组:所有伴侣对 |
所有名单、属性、约束都只在浏览器本地处理:
"随机抽签"是从 N 里挑 K 个,本工具是把 N 个全部分成 K 组——目标完全不同。必须用本工具的场景:(1) 有约束——禁同组(情侣不分一桌 / 同部门避免抱团)、必同组(搭档要一起);(2) 要均衡——按部门 / 性别 / 能力均匀分布到每组;(3) 要满覆盖——所有人都得在某个组里,不是抽 5 个出来。用随机抽签就够的场景:班级随机点 3 个人答题、年会抽奖、做选择题——这些都是"挑出来"而不是"分组"。两者互补,工具页底部"相关工具"互相链接。
两种写法都识别:(1) 名字,k=v,k=v 格式——张三,部门=研发,性别=男、李四,部门=产品,能力=A,工具会自动收集所有出现过的属性键作为"按属性均衡"下拉选项;(2) 名字,标签 格式——张三,研发、李四,产品,名字后面任何不带等号的内容都会归到统一的"标签"属性下。分隔符:英文 , 和中文 , 都识别,等号 = 和中文 = 都识别。何时填属性:只在需要"按属性均衡"时填——比如想保证每组研发 / 产品比例一致;纯随机分组不需要任何属性。
每行一对或一组,逗号分隔。必同组:张三,李四 表示这两个人必须在同一组;写 王五,赵六,孙七 表示这三个人必须在同一组(工具用并查集把多条"必同组"传递合并——A,B 和 B,C 会让 A/B/C 都成为同一单元)。禁同组:张三,李四 表示这两个人不能在同一组;写 周八,吴九,郑十 表示这三个人两两都不能同组。冲突检测:如果同两个人既在"必同组"又在"禁同组",工具会直接报"约束冲突";如果某个必同组单元的人数超过你设的最大组容量(比如 5 人必同组但每组只能 4 人),也会立刻提示。
软约束——尽量均匀,不保证完全一致。算法会跑最多 300 次随机分配,每次计算"该属性在各组的分布方差",保留方差最小的那次。完美均衡的前提:(1) 该属性的每个值的总人数能被组数整除(如 8 男 8 女分 4 组每组 2 男 2 女);(2) 没有其他约束冲突。做不到完美的情况:(a) 总人数除不尽(7 男 5 女分 4 组,肯定有两组 2 男 1 女、两组 1 男 2 女);(b) "禁同组"约束把同属性的人锁死在不同组;(c) "必同组"单元里就已经属性单一(3 男必同组 → 那一组必然男生扎堆)。结果区会显示"不平衡度 X.X"——0 是完美,越大越不平衡,可以多点几次"重新洗牌"看能否更低。
只在"按每组人数"模式下,并且总人数不能整除每组人数时才有区别。均匀分配(默认):余数分散到几个组里,每组最多差 1 人。例 17 人按每组 4 → 17 = 4+4+4+5,4 组里有一组 5 人;或者 17 人按每组 5 → 17 = 5+5+4+3 → 实际"均匀"算法会算成 17/⌈17/5⌉=17/4 → 4+4+4+5 + 没用上"每组 5 人"。单独一组:前几组按你指定的人数装满,剩余的不管几个都自成一组。例 17 人按每组 4 → 4+4+4+4+1(最后一组只有 1 人)。抽掉:仅在"按每组人数"模式可选——直接把不够凑一组的人随机抽掉,输出全是满员组。例 17 人按每组 4 → 4 组 × 4 人 + 抽掉 1 人。Secret Santa(必须两两配对)、淘汰赛抽签(必须满员)用"抽掉";课堂分组一般用"均匀分配";要明显区分"主组 + 散户"用"单独一组"。
完全不上传,全部在浏览器本地运行。名单、属性、约束条件都只存在浏览器 localStorage 和当前页面 DOM 里,关掉标签页或清浏览器数据就消失,刷新页面会自动恢复上次的输入。性能上限:算法每次最多跑 300 轮随机分配,500 人内毫秒级返回;超过 1000 人但约束很松也能跑(< 1 秒);如果约束极紧(很多必同组 + 禁同组互相牵制),可能跑满 300 轮也找不到完美方案,会在警告区提示"约束太紧"——这时手动放宽几条约束、或者增加组数 / 每组人数即可。
两个导出选项:(1) 复制按钮——按"第 N 组(X 人)"格式排版的纯文本,粘到微信群 / 飞书 / 钉钉,对方原样看到完整分组;(2) CSV 按钮——下载带 UTF-8 BOM 的 CSV 文件,Excel / WPS / Numbers 双击打开中文不乱码,列是"组号 / 姓名 / 属性...",可以直接打印或继续在表格里二次处理(加备注、加菜品安排、加签到列等)。没有自带海报导出——如果要做分桌牌、签到墙,把 CSV 拿去 Canva / 美图秀秀 / 微信公众号"图文消息"里排版即可。
核心三步:(1) 必同组合并——用并查集把所有"必须同组"的人合并成"单元",单元内成员永远绑在一起移动;(2) 重复随机分配——把单元随机洗牌,按"组大小递减"逐个填进还有空位的组里,遇到禁同组冲突就跳过该组找下一个;(3) 打分保最优——每次成功分配后计算"按指定属性的不平衡度",跑最多 300 次保留最低分的那次。为什么每次不一样:第 (1) 步的洗牌种子是 Math.random(),浏览器每次会给不同种子;只有在约束极紧时才会反复探索同样的少数解,那时多次重洗会看到完全相同的结果。