在线随机抽取工具

粘贴任何姓名、任务或想法清单,让这个工具公平地做出选择。每次抽取都在您的浏览器中运行,并使用密码学级别的安全随机性,因此您的清单绝不会离开您的设备。

点击生成以抽选
分隔符将自动检测,或者您可以在下方进行设置。
高级选项

需要抽出赠品活动的获奖者、点名让学生发言,或者决定谁来洗碗?这个免费的在线随机抽取工具能够公平地从您粘贴的任何清单中进行抽取。将您的条目放入「项目」框中——每行一个,或者以逗号分隔——通过「生成数量」设置您想要的数量,然后点击「生成」。一个列表至少需要两个条目,最多可容纳 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,也正是这种直觉使我们自己在进行随机挑选时表现得很糟糕——当被要求随机选择时,我们会避开第一个和最后一个条目,避免重复相同的名字,并且把我们的选择分配得比真正的随机概率要均匀得多。看起来可疑地整齐的结果其实是人类行为的痕迹;真正的随机性往往会产生聚集现象。

为什么选择这个随机抽取工具?

只要做出的选择必须经受住质疑,随机抽取就会派上用场。老师在不偏袒任何人的情况下点名学生发言,并将全班分成各个项目小组。主播和营销人员在观众面前抽取赠品和抽奖获胜者,而观众必须相信结果是公平的。经理们分发没人主动承担的任务,团队决定演示顺序或谁来值班。研究人员提取随机的记录样本以进行审计。家人结束关于看什么节目的争论,饥肠辘辘的一群人决定去哪家餐厅吃饭。它们的共同之处在于任何人都能在事后解释这个选择过程:该抽签使用了密码学级别的随机性,它完全在您的设备上发生,如果后来有人询问,「历史记录」还可以保留该结果。

了解一些客观存在的限制是值得的。抽取工具无法抽出比您的列表所包含的更多的独立条目——三个赢家至少需要三个名字——它的上限为 1000 个条目(每个最多 200 个字符),并在一次抽取中最多产生 100 个结果。「打乱顺序」和「排序」是逐行工作的,因此只有当逗号分隔的列表被转换为每行一个条目时,才能对其进行重新排列;而且它们俩都是重排文本框的内容,而不是改变抽取机制本身,无论您的条目顺序如何,抽取过程都同样公平。从设计上讲,每个条目也具有完全相同的权重,因此如果一次抽取中需要某个名字的概率加倍,则必须在列表中将该名字列出两次。在这些限制条件之内,本工具的保证是坚如磐石的——在每一次的抽取中,您列表中的每一个条目都具有完全相同的机会。

FAQ

如何从清单中抽取一个随机姓名?

将姓名粘贴到「项目」框中——每行一个,或以逗号或空格分隔——将「生成数量」保持为 1,然后点击「生成」。一个名字将被立刻抽出。如果需要一次抽取多个名字,请将「生成数量」增加到您需要的数值。

这样的选择真的公平吗?

是的。每一次抽取都使用了您浏览器的 Web Crypto API (crypto.getRandomValues) 并结合 rejection sampling,这消除了常规实现中容易产生的 modulo bias。无论某个条目在列表中的位置如何,它被选中的概率都完全相等;并且在抽取多个不同条目时,使用了 Fisher-Yates 算法进行打乱顺序,因此该规模的每一个群组被抽出的可能性也是相等的。

我的清单会被上传到你们的服务器吗?

不会。整个抽取过程都在您的浏览器本地运行:您的清单、抽取结果和历史记录绝不会离开您的设备,因此粘贴姓名、电子邮件或任何私密清单都是安全的。「从文件加载」也是本地操作——您的浏览器会自行读取该文件,不会上传任何内容。

我可以粘贴用逗号或空格分隔的清单,而不是每个项目占一行吗?

可以。「项目分隔符」默认设置为「自动检测」,它能自行区分换行符和逗号,因此从电子表格、聊天消息或文档中复制的列表可以直接使用。以空格分隔的列表需要多做一步——将「项目分隔符」设置为「空格」——因为像全名这样的条目本身就包含空格,系统永远不会自动基于空格对它们进行分割。如果您的数据混合了多种格式,请将「项目分隔符」锁定为「换行」或「逗号」。

「不重复」开关有什么作用?

当开启「不重复」时,被抽中的每个条目都是不同的——就像从帽子里抽出纸条而不放回去一样,这正是您在抽取获奖者或分组时所需要的。当它关闭时,同一个条目可以被多次抽中,统计学家称之为 sampling with replacement。

为什么「不重复」和「结果格式」这两个控件是灰色的?

因为它们仅在您抽取多个条目时才适用,正如旁边的提示所述:「仅当生成数量大于1时适用」。将「生成数量」增加到 2 或更高,这两个控件就会变为可用;在数量为 1 时,没有任何内容可以重复,也没有任何结果需要分隔。

「结果格式」选项有什么作用?

它设置了如何显示和复制多个被抽中的结果:显示为「每个项目占一行」,用于快速聊天消息的「以空格分隔」,或者用于粘贴到电子表格或脚本中的「以逗号分隔」。一旦「生成数量」达到 2 或以上,它就会变得可用。

「打乱顺序」和「排序」按钮有什么作用?

「打乱顺序」会重新排列「项目」框中条目的顺序,而「排序」会按字母顺序排列它们,其中的数字也会被自然排序——再次点击会反转该顺序。两者改变的只是您的列表的显示方式,而不是抽签机制的运作方式:无论条目的顺序如何,该抽取工具都同样公平。

清单可以包含多少个项目,我一次可以抽取多少个?

列表可容纳 2 到 1000 个条目,每个条目最多 200 个字符,并且一次抽取最多返回 100 个结果。空行和周围的空格将被忽略,因此从电子表格或文档粘贴的列表可以直接原样使用。

它适合用于抽取赠品或抽奖活动的获胜者吗?

适合,而且这是最常见的用途之一。粘贴参赛者名单,将「生成数量」设置为奖品数量,保持开启「不重复」以确保无人能中奖两次,然后点击「生成」。由于该抽签使用了密码学级别的随机性并且完全在您的设备上运行,这个过程很容易解释,而且如果参赛者事后提出质疑,「历史记录」还可以保留该结果。

我可以用它将人们分成不同的小组吗?

可以。将「生成数量」设置为第一组的人数并点击「生成」——抽出的名字就是第一组。将这些名字从列表中删除,然后重复该操作以抽取下一组。保持开启「不重复」可以确保无人同时出现在两个小组中。

为什么同一个名字会连续出现两次?

因为独立的抽签本来就会出现重复,而这正是随机性的真实模样。每一次抽取都会忽略之前发生的所有抽取,因此在一个包含十个名字的列表中,同一个名字连续出现两次的几率每次都是 1/10——这很常见,并不是出了故障。如果您需要同一次抽取中的每个结果都不相同,请开启「不重复」。

这个抽取工具会记住我的选择吗?它是免费的吗?

「历史记录」会在您自己的浏览器中保留最近 10 次的抽取记录,因此您可以恢复、复制或删除之前的记录,并在您想清理时随时清空所有记录。该工具完全免费且无需注册,而且因为没有任何数据被传输,即使我们想看,我们也无法看到或存储您的抽取结果。