随机数生成器
生成器所有处理都在浏览器本地完成,数据不上传服务器
随机数看起来是最简单的一件事,而「生成得对不对」全在几个容易忽略的地方。 随机源用的是 `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 位可调
- 全部在本机生成,不请求任何接口
使用方法
- 选整数还是小数
- 填最小值、最大值与个数
- 需要去重或排序就勾上、选上
- 点「重新生成」换一批,点「复制」取走
常见问题
- 为什么不用 Math.random?
- 因为 `Math.random` 在部分引擎上是可预测的伪随机序列 —— 观察到足够多的输出之后,下一个值能被推算出来。用它做抽奖、发优惠码、随机分组,等于把结果交给了能看见序列的人。这个工具用的是 `crypto.getRandomValues`,它是操作系统提供的密码学随机源,不对外暴露内部状态。
- 「不出现重复值」为什么直接报错,而不是少给几个?
- 因为那是一个承诺。你说要 10 个互不重复的数,我给你 7 个,你会以为工具坏了或者以为自己数错了;给你 10 个里面有重复,你会以为去重功能没生效。两种都比报错更糟 —— 报错至少告诉你「这个范围凑不出来」,而且提示里会写明范围里实际有多少个可用值。
- 生成的数够随机吗?会不会有偏?
- 两个方面都处理了。随机源是密码学级的(见上一条)。取值方式用的是拒绝采样:先算出「能被范围整除」的那一段,落在这一段之外的取值直接丢掉重取。常见的 `随机字节 % 范围` 写法会让靠前几个数出现得略多(1 到 10 在 0–255 上取模时,0–5 有 6 个来源、6–9 只有 5 个),差别很小但真实存在,而抽奖这类用途恰恰在乎这个。
相关工具
UUID 生成
生成器一次生成一整列 UUID v4、v7、ULID、NanoID 或 MongoDB ObjectId,每行一条,可直接粘进表格或脚本。随机数取自浏览器加密接口,不联网、不记录。
质数查询
生成器判定一个数是不是质数、做质因数分解、查第 N 个质数、列出区间内的质数,或随机生成质数。大数用米勒-拉宾判定,快。
模拟数据
生成器按「字段名:类型」写几行字段,就能得到一整批格式逼真的模拟数据,可导出 JSON、CSV、TSV、SQL、XML、YAML 或 TOML。
占位文本
生成器生成占位文本,可选拉丁文 Lorem ipsum、英文句子、中文或日文填充句,按段落、句子或单词输出。全部在浏览器本地生成,不联网。
二维码
生成器把文本、链接、WiFi 配置、名片、日历事件生成二维码,前景与背景色可调,可下载 PNG 或矢量 SVG。编码全程在浏览器本地完成。
密码生成
生成器生成随机强密码,长度与字符集可调,并实时给出熵值,让「强度」变成一个可以比较的数字。密码只在本机内存里,不记录也不上传。