跳到主要内容

从名单随机抽取的正确做法:随机抽行、抽奖点名、公平开奖

教你从一份多行名单里随机抽几行:抽奖开奖、随机点名、做随机决策。讲清不放回去重、crypto 级公平随机的原理,以及如何把名单分享给同事复核。

发布于 作者 李雷
#随机抽取 #抽奖 #随机点名 #名单 #在线工具

从名单随机抽取的正确做法:随机抽行、抽奖点名、公平开奖

办活动开奖、站会点名、十家午餐店里挑一家,这些事的内核是同一件:从一份多行名单里,公平地抽出几行。看着简单,真要做到「谁来复核都挑不出毛病」,有几个坑得绕开。这篇把我自己踩过的地方讲清楚。

随机抽行到底在解决什么问题

你手上有一份名单,每行一条,可能是 20 个抽奖参与者,也可能是 2000 条问卷回答。你想从里面挑出 M 行,而且这个「挑」不能被人质疑你偏向了谁。

把它拆开看就是两步:先确定候选池有多少行,再从池子里等概率地取出 M 行。比如从 50 行随机选 3 行,理想状态是每一行在第一抽时都正好是 50 分之一的概率,不会因为它排在名单最上面或最下面就更容易中。

听起来理所当然,但很多临时方案做不到这一点。用表格函数截取前几行、按某个字段排个序再拿头部,这些都不是随机,只是「看起来乱」。真随机要的是:名单的每一种排列出现的概率都相等。

公平随机不是玄学,是用对随机源

浏览器里有两种随机数。Math.random 快,但它不是为公平设计的,种子可被推测,不适合开奖这种要经得起复核的场景。另一种是 crypto.getRandomValues,密码学安全的随机数发生器,这才是抽奖该用的。

随机抽行工具 走的是后者,再配上 Fisher-Yates 洗牌:把整份名单彻底打乱,每一种排列出现的概率都相等,然后取前 M 行。所以「不放回抽 3 行」的本质,就是先公平打乱再取前三个,数学上和直接抽奖是一回事。

这一点在直播开奖时特别值钱。你可以先把名单链接分享给观众,让他们看到完整的参与池,再在屏幕上现场按下抽取。因为随机结果从不写进链接,分享出去的只有候选名单,在你按按钮之前结果一直不可预测,看得见地没法作弊。

抽几行、放回还是不放回、要不要去重

这三个选项决定了你抽出来的东西对不对。

抽几行就是 M,你要几个中奖者就填几。放回和不放回是关键区别:不放回时同一行最多中一次,像从帽子里抽名字、抽完不放回去,这是公平抽奖默认要的;放回时每抽中一个就放回去,同一行能再被抽到,甚至能抽出比名单还多的条数,适合带权重的重抽。举个具体的:从 [A, B] 里放回抽 3 条可能得到 [A, A, B],不放回则最多抽到 2 条。

去重和清理是另一层。多敲一下回车会造出一个空行,它可能被抽中成一个空白中奖者;行首带空格的「张三」和不带空格的「张三」会被当成两个不同的人。开着「去掉首尾空格」和「跳过空行」,再瞄一眼名单框上方的行数,确认清理后真实的池子有多大,再开抽。如果名单本身就脏,先用 文本去重工具 把重复行清掉,池子干净了抽出来才准。

一个真实的例子:从 12 人名单随机抽 3 个

我上个月给组里排周会分享顺序,12 个人谁先讲一直定不下来。我把 12 个名字每行粘一条,数量设成 3,放回关着,点了一下抽取。

结果是三个互不相同的名字逐个高亮出来,我直接复制进群。有人半开玩笑说「是不是你挑的」,我把名单链接甩过去,大家自己打开看到的是同样的 12 人候选池,但谁也复现不出我那一抽的结果,因为结果根本没进链接。这事就这么定了,没人再说是有人引导的。后来我又把数量设成 12、不放回,一次排出了整个季度的发言顺序。

把它当决策器用

很多决定卡住,不是因为难,是因为没人愿意先开口选。十家午餐店争来争去,把它们列出来点一下抽取,争论就结束了。派杂活、给分享挑话题、从一堆选项里抽一张牌,都是一行一个选项、一个按钮的事。决定做出来了,谁也别想说是有人故意引导的。

如果你要的不是「抽几行」而是「把整份名单重新排个序」,那是另一件事,用 列表随机排序工具 更合适,它返回的是换了顺序的完整名单,适合排出场顺序或演示队列。

几个容易翻车的地方

放回关着却想抽的比名单还多,不放回最多只能返回你粘进去的不重复行数,从 6 个人里要 10 个中奖者只会给你 6 个,真想抽 10 次就打开放回。还有别指望分享链接能还原中奖者,链接只编码名单和数量、从不编码结果,这是故意的;要证明谁中了,复制结果文本贴出去,别假设同事打开链接会看到同样的名字。

把这几条记住,从名单随机抽取这件事就稳了:用对随机源,设对放回和去重,看清楚池子大小,该公平的地方就经得起任何人复核。


Made by Toolora · Updated 2026-06-13