随机数生成器

在任意范围内生成一个随机数、一份列表,或多组数字——全部直接在您的浏览器中使用密码学安全的随机性生成,绝不经过服务器。

点击生成以抽选
选项

需要一种快速又公平的方式获取随机数吗?这个免费的在线随机数生成器可在您选择的任何范围内生成一个数字——或整份数字列表——从简单的 1 到 10 范围,到跨越数十亿的范围都可以。在「最小值」和「最大值」中设置最小值和最大值,用「生成数量」选择需要多少个数字,然后按下「生成」。两个边界值都会包含在结果中,因此 1 到 10 的范围可以同时生成 1 和 10。

每个结果都直接在您的浏览器中使用 Web Crypto API(crypto.getRandomValues)生成——它使用操作系统提供的密码学安全随机源生成随机值。没有任何内容发送到服务器,也不会在服务器上保存任何记录,我们也永远不会看到您的数字。生成过程即时完成、完全私密,即使在网络连接缓慢的情况下,页面加载后依然能正常运作。

这些选项是为人们真正需要随机数的实际场景而设计的。开启「不重复」可确保没有任何数字重复出现——这正是抽奖、随机抽签,或将人员分组而不重复时所需要的设置。需要从 500 名参与者中选出 20 名获奖者?将「最小值」设为 1、「最大值」设为 500,开启「不重复」,将「生成数量」设为 20,然后按下「生成」。「排序方式」可将结果按升序或降序排列,一个按钮即可一次性复制所有结果。将「结果格式」从「换行」切换为「以空格分隔」或「以逗号分隔」,即可显示「组数」:一键生成多组独立抽签——例如二十组、每组 3 个数字,用于二十轮抽签——而「允许组间重复」则决定同一个数字是否可以出现在多于一组当中。

这种随机性究竟是如何生成的?您的浏览器通过 Web Crypto API 提供具有密码学强度的随机值,而不是通过诸如 Math.random() 这样的 JavaScript 伪随机数生成器。当您按下「生成」时,页面会使用 crypto.getRandomValues 请求随机值,并用它们在您选定的范围内生成数字。这种随机性的底层来源由操作系统提供,并由浏览器通过 Web Crypto API 提供访问,因此页面本身不需要维护自己的种子(seed)或伪随机序列。

将一个原始数值映射到您所选的范围内,正是生成器最容易悄悄出错的地方,这值得单独用一段来说明。将数值对范围大小取模看似是最直接的方法,但恰恰也是有偏差的方法:如果范围大小不能整除 2^32,那么最小的一些数字出现的频率会略高于其他数字。这个缺陷被称为取模偏差(modulo bias),它是可以测量的,并非只是理论问题。这个生成器的做法是:丢弃任何超出范围最大整数倍的数值,然后重新抽取一个新值——这种技术被称为拒绝采样(rejection sampling)。这样做需要多花几次抽取,但换来的是精确的保证:「最小值」与「最大值」之间的每一个数字,被抽中的概率都完全相等,而不只是接近相等。

是什么让一个数字真正做到随机?当先前的结果无法透露关于下一个结果的任何信息时,这个数字就足够随机了——而实际上这可以分为三个层次。像 Math.random() 这样的普通伪随机函数运行的是一种确定性(deterministic)算法:任何知道其内部状态的人都能重现整个序列——这对于打乱演示文稿的幻灯片顺序来说完全没问题,但对于任何结果不应被预测的场合都不适用。这个工具使用的密码学安全随机生成器,本质上也是一种算法,但它被设计为使用安全的系统随机性来源生成不可预测的值,并使得在实际情况下无法根据已有输出预测下一个值。物理随机性,来自诸如大气噪声或放射性衰变这类来源,属于另一类随机性来源,与以上两种方式不同,不过对于在某个范围内抽取一个数字而言,这种实际差异几乎不存在。这正是浏览器提供独立的 crypto API,而不是直接改进 Math.random() 的原因:两者解决的是不同的问题,而当结果对某人而言真正重要时,只有其中一种是安全的。

一个真正随机的序列,本来就不是为了在人眼中显得随机而设计的。在 1 到 10 之间抽取十个数字,您会经常看到重复、像 7、7、8 这样接近的一对,或是连续几个较大数字组成的短序列——而这一切都完全正常。真正的随机性是不可预测的,而不是均匀分布的:每一次抽取都是独立的,之前出现的数字完全不会影响之后的数字,也没有任何数字会「欠」一次出现。坚持相反看法的直觉被称为赌徒谬误(gambler's fallacy),正是这种直觉也让人类自己成为糟糕的随机数生成器——当被要求自己想出一个随机序列时,我们会刻意避免重复,把数值分布得比真正的概率所呈现的更加均匀。看起来出奇整齐的结果,其实正是人类的痕迹;而真正的随机性反而会产生成簇的聚集。

为什么选择这个随机数生成器?

随机数的用途远比大多数人想象的更广泛。教师借此公平地随机点名学生回答问题。主播和营销团队在必须让观众相信结果的场合,当众抽出赠品和抽奖的中奖者。玩家用它替代丢失的骰子,或决定谁先开始,而各类比赛则用它抽签决定出场顺序。研究人员选取随机样本,以便研究结果能够推广到自愿参与者之外的更广泛人群。开发者用它生成测试数据、为模拟设置种子,并在 QA 过程中选取标识符。所有这些用途的共同点,是一个日后可以被解释清楚的随机选择过程:因为这个抽取过程使用了密码学级别的随机性,并且完全在您的设备上完成,一旦有人提出质疑,您就能解释并记录这一随机选择过程是如何进行的。

这个生成器有几个客观的局限,值得您了解。「不重复」模式无法生成超出范围本身所含数量的数字:1 到 10 之间根本不存在 20 个互不相同的数值。每次抽取都是独立的,先前的结果不会影响之后的结果,因此刷新页面并不会重置任何周期——因为这里本来就没有周期存在。而且,尽管这些数字来自密码学安全的随机源,这里的抽取只是一次公平的选择,而不是一种预测:官方彩票开奖使用的是它们自己的物理设备或经过认证的设备,您浏览器中计算出的任何结果都与它们没有任何关联。在这些局限之内,这份保证是非常可靠的——在每一次抽取中,您所选范围内的每个数字被抽中的概率都完全相等。

FAQ

这种随机性是密码学安全的吗?

这个工具使用您浏览器的 Web Crypto API(crypto.getRandomValues),它从操作系统具有密码学强度的安全来源获取随机性。与简单的伪随机函数不同,它的输出被设计为在实际中不可预测,而拒绝采样确保范围内每个数字被抽中的概率相同,不会偏向数值较小的那些数字。

如何在特定范围内生成随机数?

在「最小值」字段中输入可能的最小数值,在「最大值」字段中输入最大数值,然后按下「生成」。两个边界都计入结果范围之内,所以 1 到 10 的区间既能出现 1,也能出现 10。

我可以一次生成多个随机数吗?

可以。在「生成数量」字段中填入您需要的数量(最多 1000 个),生成器会一键准备好整份列表。之后您可以使用复制按钮将所有结果复制到剪贴板,也可以直接保存为文件。

我可以一次生成多组数字吗?

可以。将「结果格式」从「换行」切换为「以空格分隔」或「以逗号分隔」,即可显示「组数」字段。填入您所需的独立抽签数量——例如 20 组、每组 3 个数字,用于 20 轮抽签——然后选择是否允许不同组之间的数字重复。

我可以对生成的数字进行排序吗?

可以。使用「排序方式」将每份列表按升序或降序排列,或者保持在「无」以维持数字生成时的原始顺序。

如何避免出现重复的数字?

开启「不重复」开关。开启后,列表中的每个数字都能保证互不相同——非常适合抽奖、奖品抽签,或是将人员分组。请注意,选择的数量不能超过范围本身的大小:1 到 10 之间无法生成 20 个互不相同的数字。

为什么同一个数字会不断重复出现?

因为独立的抽取本来就可能重复,这正是随机性真实的样子。每一次抽取都会忽略之前的所有结果,所以在 1 到 10 的范围内,同一个数字连续出现两次的概率始终是十分之一——这是正常现象,不是故障。如果您需要没有重复的列表,请开启「不重复」——这是刻意限制抽取范围,而不是在修复某种缺陷。

为什么随机序列看起来不像是随机的?

因为真正的随机性是不可预测的,而不是均匀分布的。人们通常期望随机结果会整齐地分散开来,所以像 7、7、8 这样的聚集、重复和短序列会让人感觉像是出了问题,但这恰恰正是概率本身所产生的结果。在人眼中显得整齐的序列,往往正是那个其实并不随机的序列。

浏览器中生成的随机性可以信任吗?

可以,只要它来自 Web Crypto API,正如这里所使用的一样。crypto.getRandomValues 利用您浏览器所在系统的随机性提供具有密码学强度的数值,而不是像 Math.random() 这样的 JavaScript 伪随机数生成器。对于任何重要的用途,都应该对 Math.random() 保持怀疑:它是确定性的(deterministic),从未被设计为不可预测。

随机数可以被预测或影响吗?

在正常使用情况下,实际上无法根据之前的结果预测下一个结果。这些数值来自您操作系统中具有密码学强度的生成器,因此,仅根据之前的结果,在实际情况下无法预测下一个结果,而且抽取过程完全在您的设备上完成——没有服务器可以被篡改,也没有任何请求可以被人拦截。我们自己同样无法影响您的结果,因为我们从不会看到它们。

它适合用来选出赠品或抽奖的中奖者吗?

适合。为每位参与者分配一个号码,在该范围内生成一个结果,号码相符的参与者即为中奖者。由于随机来源具有密码学强度,抽取过程也完全在您的设备上完成,如果有参与者对结果提出质疑,您可以解释并记录这一随机选择过程是如何进行的。至于选择彩票号码,这个工具起到的是随机选择的作用,而不是预测工具:官方彩票开奖与这个工具完全没有关联。

刷新页面会改变随机性吗?

不会,也完全没有必要。每一次抽取本来就会向操作系统请求全新的数值,所以无论您连续按下十次「生成」,还是每按一次就刷新一次页面,结果始终是相互独立的。这里没有需要重新开始的周期,也没有会过期的状态——刷新只会清除屏幕上显示的结果。

这个生成器是免费的吗?你们会保存我的数字吗?

这个工具完全免费,无需注册。所有数字都在您的浏览器中本地生成,永远不会离开您的设备,所以即使我们想要,也无法保存或查看您的结果。