随机数生成器
在指定范围内生成不重复的随机数,或者用字母、数字和符号生成随机字符串,随机源是crypto.getRandomValues。
如何生成随机数和随机字符串
- 1
选择数字或字符串
在两种模式之间切换:一个范围内的数字(整数或小数),或者由你选择的字符类型组成的随机字符串。
- 2
设置范围或字符集
生成数字时,设置最小值、最大值,以及是否允许重复。生成字符串时,打开或关闭各类字符,也可以粘贴自己的自定义字符集。
- 3
生成并复制结果
一次最多显示10,000个值,每行一个,可以直接复制到剪贴板。
为什么用crypto.getRandomValues而不是Math.random
JavaScript的Math.random速度快,但设计时就没打算防预测。在某些引擎里,拿到少量输出就足以还原它的内部状态,进而预测后面的每一个值。crypto.getRandomValues则取自操作系统的密码学安全随机数生成器,浏览器生成加密密钥用的也是这个来源,所以光看输出序列猜不出任何规律。这个工具在所有地方都用这个来源,包括关闭重复时打乱列表。
取模偏差,以及拒绝采样怎样消除它
把一个32位随机数变成“1到100之间的值”,最简单的做法是对100取模,但这样会悄悄偏向范围的低端:2^32不能被100整除,凑不满一个完整倍数的那些剩余值,全都落到同几个结果上。这个工具的做法是:凡是落在这段不均匀余数里的抽取结果都丢弃,然后重新抽取。这叫拒绝采样,这样请求范围内的每个数字出现的概率都完全相同。
每个值都在这个标签页里生成
数字和字符串完全在你的浏览器中用Web Crypto API生成。生成的内容不会发送到服务器,也不会写入浏览器存储。分享链接只记录你的设置,从不包含实际生成的值,因为一个能被预测的链接,会让随机抽取失去意义。
常见问题
crypto.getRandomValues为什么比Math.random好?
Math.random优化的是速度,不是不可预测性。已经有人证明,在好几种JavaScript引擎里,只要少量输出样本就能还原它的结果。crypto.getRandomValues取自操作系统的密码学安全随机数生成器,没有这种捷径可走。
范围很大时,“不重复”是怎么实现的?
可能的值不超过五百万个时,工具用Fisher-Yates洗牌算法打乱整个列表,再取出你要的数量。超过这个范围时,它一次抽一个值,只保留新的值。因为你要的数量远少于范围内的值,碰撞很少,所以速度依然很快。
什么是取模偏差?为什么不直接用%取范围?
用普通的取余运算缩小一个32位随机数,会让范围低端的数字出现得稍微多一点,因为2^32不是大多数范围大小的整数倍。这个工具会丢弃并重新抽取会造成这种偏斜的那一小部分值,所以范围内每个结果出现的可能性都相同。
生成的结果能当密码用吗?
在这里用较大的字符集和足够的长度生成的随机字符串,和专门的密码生成器生成的密码一样强。如果你需要熵值、强度评分或密码短语,请用密码生成器,它就是为这些设计的。
一次能生成多少个数字或字符串?
每批最多10,000个,数字和字符串都一样。抽奖、测试数据和抽样这些场景都绰绰有余,不需要反复运行工具。
生成的值会离开我的浏览器吗?
不会。每个数字、每个字符都用Web Crypto API在本地生成,不会上传到任何地方。复制到剪贴板是值离开页面的唯一途径,而这完全由你掌控。
分享链接为什么不包含实际的数字?
链接只还原你的设置(范围、数量、是否允许重复),从不包含值本身。如果一个链接能随时重放同一组“随机”数字,这些数字就可以被预测,这样生成它们也就没有意义了。