需要抽出赠品活动的获奖者、点名让学生发言,或者决定谁来洗碗?这个免费的在线随机抽取工具能够公平地从您粘贴的任何清单中进行抽取。将您的条目放入「项目」框中——每行一个,或者以逗号分隔——通过「生成数量」设置您想要的数量,然后点击「生成」。一个列表至少需要两个条目,最多可容纳 1000 个条目,每个条目最长可达 200 个字符。
每一次抽取都直接在您的浏览器中使用 Web Crypto API (crypto.getRandomValues) 完成,这会从您的浏览器底层系统随机性中提供具有密码学强度的随机值。您的清单永远不会发送到服务器,不会被记录,我们也绝不会看到——这一点在此类工具中比在多数生成器上更为重要,因为人们粘贴的通常是客户名单、班级点名册或同事的姓名。「从文件加载」按钮同样遵守这一承诺:您的浏览器会读取文件并在本地填充该文本框,不会向任何地方上传任何内容。
这些选项是为人们在实际中拥有的列表格式而设计的。「项目分隔符」默认设为「自动检测」,它会读取换行符和逗号,并判断您的列表使用的是哪一种,因此从电子表格、聊天消息或文档中复制的列表无需重新格式化即可直接使用。当您的数据混合了多种格式时,可以将其锁定为「换行」、「逗号」或「空格」——并请注意,「空格」始终是一个有意的选择,并且永远不会是自动的,因为像全名这样的条目本身就包含空格,如果默认按空格分割,反而会破坏列表。「生成数量」决定了要抽取的条目数,范围从 1 到 100。要从 200 名参赛者中抽出 3 名获奖者?粘贴参赛者名单,将「生成数量」设为 3,然后点击「生成」。有两个控件仅在数量达到 2 或以上时才适用,在此之前将保持灰色不可用状态:「不重复」决定同一个条目是否可以被抽中两次,而「结果格式」则设置被抽中的结果应如何分隔——「每个项目占一行」、「以空格分隔」或「以逗号分隔」。
「项目」框内的一排按钮可执行您原本在其他应用中进行的编辑操作。「从文件加载」直接从纯文本或 CSV 文件中提取列表。「打乱顺序」会重新排列框中条目的顺序,「排序」会按字母顺序排列它们,其中的数字也会被自然排序,再次点击则反转顺序,而「清除」则会清空文本框。「填充示例数据」会放入一个简短的示例列表,让您只需点击一下就能试用这个抽取工具,而「展开」会展开文本框以完整显示长列表,「折叠」则将其缩回默认大小。在结果下方,「全部复制」会将每个抽取结果放入剪贴板,「保存为文件」将它们保存为一个文件,而「历史记录」会在您的浏览器中保留最近 10 次的抽取结果,因此找回之前的记录只需点击一下。
抽取实际上是如何进行的?当您点击「生成」时,页面会通过 crypto.getRandomValues 向浏览器请求随机值,并利用它们在您的列表中选择位置,而不是通过 Math.random() 这样的 JavaScript 伪随机函数。将原始的 32 位随机值转换为一个位置,正是许多抽取工具悄悄出错的地方:将该值对列表长度取模是最直白的方法,但它带有偏差,因为除非 2^32 能被列表的长度整除,否则列表中靠前的条目出现频率会略高于其他条目。这种缺陷被称为 modulo bias,它是可以测量的,而不仅仅停留在理论上。相反,本工具会丢弃任何超出列表长度最大整数倍的值并重新抽取——这种技术称为 rejection sampling。它会消耗几次额外的抽取次数,但换来的是确切的公平保证,而不是近似值。列表中的位置不会改变任何事情:在每一次抽取中,第一个条目和最后一个条目拥有完全相同的概率。
「不重复」区分了两种截然不同的抽取方式,而在统计学中它们各有名称。当开启它时,抽取工具会使用 Fisher-Yates 算法对您的列表副本打乱顺序,然后从顶部开始提取条目——这与从帽子里抽出纸条并且不放回去是一样的,因此没有人会被抽中两次,并且该规模的每一个群组被抽出的可能性也是相等的。这就是 sampling without replacement(无放回抽样),这正是您在抽取获奖者、分组或决定出场顺序时所需要的。当关闭它时,每一次抽取都独立于整个列表进行,所以同一个条目可能会出现不止一次——这就是 sampling with replacement(有放回抽样),当每个人在每一轮中都保持入选资格时(例如在重复抽签或快速统计抽样中),这就是您需要的。这两种模式没有哪一种比另一种更公平;它们只是在回答不同的问题。
一场公平的抽签本来就不该在表面上看起来很公平。如果在十个名字中抽出五个,您会经常看到在原始列表中相邻的两个结果被双双抽中,或者在允许重复的情况下同一个名字连续出现两次,而这每一次其实都是很平常的现象。每一次抽取都是独立的:先前的结果对后来的结果没有任何影响,而且没有任何人「理应」获得中奖机会。坚持认为事实并非如此的直觉就是 gambler's fallacy,也正是这种直觉使我们自己在进行随机挑选时表现得很糟糕——当被要求随机选择时,我们会避开第一个和最后一个条目,避免重复相同的名字,并且把我们的选择分配得比真正的随机概率要均匀得多。看起来可疑地整齐的结果其实是人类行为的痕迹;真正的随机性往往会产生聚集现象。
为什么选择这个随机抽取工具?
- 仅在浏览器内抽取:您的列表只在您的设备上读取,绝不会被发送到任何地方
- Web Crypto API 随机性:具有密码学级别的安全,而非使用 Math.random()
- 无 modulo bias:使用 rejection sampling 确保每个条目的概率完全相等
- 任何列表格式:换行、逗号或空格,无需重新格式化
- 「不重复」模式:抽取获胜者或团队,确保无人被选中两次
- 多达 1000 个条目,并且单次可抽出多达 100 个结果
- 内置列表工具:从文件加载、打乱顺序、排序、清除、示例数据
- 历史记录和保存为文件:保留您可能需要用来证明公平性的抽取记录
- 无限制且免费:无需注册,无使用限制,不在我们的服务器上留下任何数据
只要做出的选择必须经受住质疑,随机抽取就会派上用场。老师在不偏袒任何人的情况下点名学生发言,并将全班分成各个项目小组。主播和营销人员在观众面前抽取赠品和抽奖获胜者,而观众必须相信结果是公平的。经理们分发没人主动承担的任务,团队决定演示顺序或谁来值班。研究人员提取随机的记录样本以进行审计。家人结束关于看什么节目的争论,饥肠辘辘的一群人决定去哪家餐厅吃饭。它们的共同之处在于任何人都能在事后解释这个选择过程:该抽签使用了密码学级别的随机性,它完全在您的设备上发生,如果后来有人询问,「历史记录」还可以保留该结果。
了解一些客观存在的限制是值得的。抽取工具无法抽出比您的列表所包含的更多的独立条目——三个赢家至少需要三个名字——它的上限为 1000 个条目(每个最多 200 个字符),并在一次抽取中最多产生 100 个结果。「打乱顺序」和「排序」是逐行工作的,因此只有当逗号分隔的列表被转换为每行一个条目时,才能对其进行重新排列;而且它们俩都是重排文本框的内容,而不是改变抽取机制本身,无论您的条目顺序如何,抽取过程都同样公平。从设计上讲,每个条目也具有完全相同的权重,因此如果一次抽取中需要某个名字的概率加倍,则必须在列表中将该名字列出两次。在这些限制条件之内,本工具的保证是坚如磐石的——在每一次的抽取中,您列表中的每一个条目都具有完全相同的机会。