piapia123
zh

随机数生成器

生成器

所有处理都在浏览器本地完成,数据不上传服务器

输出

随机数看起来是最简单的一件事,而「生成得对不对」全在几个容易忽略的地方。 随机源用的是 `crypto.getRandomValues`,不是 `Math.random`。 后者在某些引擎上是可以被预测的伪随机序列,用来抽奖、发券、随机分组时那是实打实的漏洞。 取值范围是闭区间。 填 `1` 到 `10`,那么 `1` 与 `10` 都取得到 —— 实现上用的是拒绝采样而不是取模,后者会让靠前的几个数出现得略多一点(1 到 10 在 0–255 上取模时,0–5 对应 6 个来源、6–9 只有 5 个)。这点偏差在小样本上看不出来,但它是一个真的偏差。 去重是承诺,做不到就说。 勾了「不出现重复值」而范围里根本不够时,直接报错,不会悄悄少给你几个或者偷偷放重复进来。 进制是一列,不是另一个工具。 「生成 10 个二进制随机数」与「生成一批再转成二进制」是同一件事,这里一次做完。

功能

  • 整数与小数两种类型,范围两端都取得到(闭区间)
  • 随机源取自 `crypto.getRandomValues`,不是可预测的伪随机序列
  • 拒绝采样保证均匀,靠前的数不会更容易出现
  • 可选去重:范围不够时直接报错,不会偷偷重复或少数几个
  • 可按升序或降序排列,排序用的就是这一批数
  • 输出可以是十进制、二进制(0b)、八进制(0o)、十六进制(0x)
  • 一次最多 1000 个,整数范围覆盖到 ±2⁵³
  • 小数位数 0–12 位可调
  • 全部在本机生成,不请求任何接口

使用方法

  1. 选整数还是小数
  2. 填最小值、最大值与个数
  3. 需要去重或排序就勾上、选上
  4. 点「重新生成」换一批,点「复制」取走

常见问题

为什么不用 Math.random?
因为 `Math.random` 在部分引擎上是可预测的伪随机序列 —— 观察到足够多的输出之后,下一个值能被推算出来。用它做抽奖、发优惠码、随机分组,等于把结果交给了能看见序列的人。这个工具用的是 `crypto.getRandomValues`,它是操作系统提供的密码学随机源,不对外暴露内部状态。
「不出现重复值」为什么直接报错,而不是少给几个?
因为那是一个承诺。你说要 10 个互不重复的数,我给你 7 个,你会以为工具坏了或者以为自己数错了;给你 10 个里面有重复,你会以为去重功能没生效。两种都比报错更糟 —— 报错至少告诉你「这个范围凑不出来」,而且提示里会写明范围里实际有多少个可用值。
生成的数够随机吗?会不会有偏?
两个方面都处理了。随机源是密码学级的(见上一条)。取值方式用的是拒绝采样:先算出「能被范围整除」的那一段,落在这一段之外的取值直接丢掉重取。常见的 `随机字节 % 范围` 写法会让靠前几个数出现得略多(1 到 10 在 0–255 上取模时,0–5 有 6 个来源、6–9 只有 5 个),差别很小但真实存在,而抽奖这类用途恰恰在乎这个。

相关工具