需要一种快速又公平的方式获取随机数吗?这个免费的在线随机数生成器可在您选择的任何范围内生成一个数字——或整份数字列表——从简单的 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),正是这种直觉也让人类自己成为糟糕的随机数生成器——当被要求自己想出一个随机序列时,我们会刻意避免重复,把数值分布得比真正的概率所呈现的更加均匀。看起来出奇整齐的结果,其实正是人类的痕迹;而真正的随机性反而会产生成簇的聚集。
为什么选择这个随机数生成器?
- 仅在浏览器中生成:数字在您的设备上生成,绝不会发送到任何地方
- 基于 Web Crypto API 的随机性:密码学安全的随机性,而非 Math.random()
- 没有取模偏差:拒绝采样确保范围内每个数字被抽中的概率都相同
- 任意范围:从 1 到 10,到跨越数十亿的数值都可以,两个边界值均包含在内
- 「不重复」模式:为抽奖和分组生成没有重复的列表
- 多组数字:一键生成多组独立抽签
- 排序与结果格式:升序或降序、换行、空格或逗号
- 历史记录与保存为文件:保留一份日后可能需要说明的抽签记录
- 无限制且免费:无需注册、没有使用次数限制、我们的服务器上不会保留任何内容
随机数的用途远比大多数人想象的更广泛。教师借此公平地随机点名学生回答问题。主播和营销团队在必须让观众相信结果的场合,当众抽出赠品和抽奖的中奖者。玩家用它替代丢失的骰子,或决定谁先开始,而各类比赛则用它抽签决定出场顺序。研究人员选取随机样本,以便研究结果能够推广到自愿参与者之外的更广泛人群。开发者用它生成测试数据、为模拟设置种子,并在 QA 过程中选取标识符。所有这些用途的共同点,是一个日后可以被解释清楚的随机选择过程:因为这个抽取过程使用了密码学级别的随机性,并且完全在您的设备上完成,一旦有人提出质疑,您就能解释并记录这一随机选择过程是如何进行的。
这个生成器有几个客观的局限,值得您了解。「不重复」模式无法生成超出范围本身所含数量的数字:1 到 10 之间根本不存在 20 个互不相同的数值。每次抽取都是独立的,先前的结果不会影响之后的结果,因此刷新页面并不会重置任何周期——因为这里本来就没有周期存在。而且,尽管这些数字来自密码学安全的随机源,这里的抽取只是一次公平的选择,而不是一种预测:官方彩票开奖使用的是它们自己的物理设备或经过认证的设备,您浏览器中计算出的任何结果都与它们没有任何关联。在这些局限之内,这份保证是非常可靠的——在每一次抽取中,您所选范围内的每个数字被抽中的概率都完全相等。