HandyTools Hub

🎲 随机数生成器

使用自定义选项生成随机数。

🔒 100% 客户端处理

随机数看起来简单,直到你开始在意它的来源。本生成器从浏览器的密码学随机源取数,支持整数或两位小数,可以强制不重复,并允许你对结果排序。它完全在页面上运行,因此加载后即可离线使用,数字也从不经过网络传输。

如何使用

  1. 设置最小值和最大值。默认的 1 到 100 是一个不错的起步范围。
  2. 选择需要多少个数字,从 1 到 1000。
  3. 选择整数或小数类型,可选地勾选「不重复」,并挑选排序方式。
  4. 点击生成,复制以逗号分隔的结果。

举个例子:最小值 1、最大值 100、数量 6、开启不重复、升序排列,可能返回 3, 17, 42, 58, 76, 91。每次运行的具体数字都不一样。

安全随机:crypto.getRandomValues 与 Math.random

属性Math.random()crypto.getRandomValues()
类型伪随机,内部有种子密码学安全
能否由先前输出推测能不能
适合令牌、密钥、抽签否是
适合界面抖动、样本数据是是,但属于杀鸡用牛刀

本工具使用 crypto.getRandomValues() 和拒绝采样。拒绝采样之所以重要,是因为那个天真的捷径——取一个随机字节再做取模——只要范围不能整除 256,结果就会偏向较小的值。本工具改为丢弃超出范围的抽取并重试,因此每个允许的取值出现的可能性都相同。

选项与校验规则

  • 最小值必须严格小于最大值。
  • 数量必须在 1 到 1000 之间。
  • 不重复模式作用于整数;数量不能超过范围容量。
  • 小数模式固定保留两位小数。
  • 排序可选:不排序、升序、降序。

如果在安全上限内、不重复生成仍然凑不满请求的数量,工具会返回较少的值并提示结果已被截断,而不是陷入死循环。正常使用中,这只会发生在范围极其狭窄的时候。

实操示例

  • 在 [1, 5] 中取五个不重复整数:结果总是数字 1 到 5 的某种排列,因为唯一可能的集合就是整个范围。
  • 在 [1, 10] 中取十个整数并升序排列:一个被打乱的 1 到 10 序列又被排回了顺序。
  • 在 [0, 1] 中取一个小数:形如 0.63 的值,两位小数都用上了。
  • 六合彩式抽号:最小值 1、最大值 49、数量 6、开启不重复,再升序排列,得到一张易读的号码单。

请注意,不重复和排序改变的是呈现方式,而不是底层的抽取。排过序的列表并不会更不随机;排序只是把已经选出的值重新排列。

本工具不做的事

每个值都取自均匀分布,因此没有加权,也无法让某些数字比其他数字更可能出现。它不生成正态或高斯分布,不模拟带自定义各面概率的骰子,也不在多次运行之间保留任何历史。它同样不是经过认证的彩票或审计系统:受监管的抽签需要一套有书面记录、可被独立验证的流程,而不是一个浏览器页面。

如果你需要的是随机标识符而不是数字,应该使用专门的令牌或 UUID 生成器,它们取自同一个安全源,只是按用途格式化输出。

有放回与无放回抽样

开启不重复会把流程从「有放回抽样」变成「无放回抽样」。不开启时,每次抽取彼此独立,可以重复,所以在 [1, 10] 中取十个数字,同一个值可能出现三次。开启后,一个值一旦被抽中就移出池子,就像从签筒里抽球:在 [1, 49] 中取六个不重复数字绝不会重复,你看到它们的顺序也不携带额外信息。到底要哪一种取决于问题本身。抽奖、调查样本或彩票选号需要不重复;模拟彼此独立的掷骰则不需要。

使用场景

  • 抽奖:最小值 1,最大值设为参与人数,数量设为奖品数,开启不重复。
  • 掷骰:最小值 1、最大值 6、数量 5、整数、不排序,模拟五次独立投掷。
  • 测试数据:批量生成数值填满电子表格的一列,再升序排列以便查看。
  • 随机分组:最小值 1、最大值 2、整数模式,把 1 和 2 当作标签,将名单分成两组。
  • 按下标抽样:在 [1, N] 中取不重复整数,即可从列表中挑出行,这些下标就是样本。

工具返回的是纯逗号分隔列表,粘贴到电子表格或脚本里通常不需要重新格式化。

安全与可用性说明

密码学 API 在当前所有浏览器中都可用,并且要求安全上下文,也就是说页面必须通过 HTTPS 提供,或运行在 localhost 上。只要浏览器提供这个 API,本工具就会直接使用它,数字不会离开你的设备。这一组合使它适合公平性重要的抽签,也适合生成种子、令牌或测试凭据;不过一旦对格式化有具体要求,专用 UUID 或密码生成器会是更好的选择。

相关工具

常见问题

这个工具使用 Math.random() 吗?

不使用。它从 crypto.getRandomValues() 取字节——这是浏览器的密码学安全生成器——并采用拒绝采样,让范围内的每个取值机会均等。Math.random() 用于动画和占位数据没问题,但它是可预测的,不该用于任何与安全相关的场合。

最大值包含在范围内吗?

包含。整数模式从最小值抽到最大值,两端都含。最小值 1、最大值 100 时,1 和 100 都可能出现,范围大小等于最大值减最小值再加 1。

请求的唯一整数可以超过范围容量吗?

不可以。校验器会在生成前就拦截,例如在 1 到 5 之间要求 10 个不重复整数。唯一集合最多只能和范围一样大,所以 1 到 5 最多允许五个。

小数模式会生成几位小数?

两位。小数值在范围内均匀生成,显示前四舍五入到两位,因此输出看起来像 37.42,而不是一长串浮点尾数。

为什么最小值不能等于最大值?

工具要求最小值严格小于最大值,因为单个数值不构成一个范围。如果只需要一个数字,可以设成 1 到 2 这样的真实区间。

可以设置随机种子来复现同样的数字吗?

不能。安全随机没有种子,按设计就不可复现,所以同样的设置每次都会产生不同的列表。如果需要可复现的值,请改用在代码中实现的带种子生成器。

由 HandyTools Hub 团队审校 · 最后更新