随机数PRNG唯一性浮点
🎲 随机数的类型与来源
- 伪随机(PRNG):通过算法生成,可复现(给定种子)。
- 真随机(TRNG):来源于物理噪声,常见于硬件或系统熵池。
前端/后端常用的是 PRNG,满足大多数工程需求。
🔢 整数与浮点的生成
// [min, max) 区间随机整数
function randomInt(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
// [min, max) 区间随机小数(保留n位)
function randomFloat(min, max, digits = 2) {
const v = Math.random() * (max - min) + min;
return Number(v.toFixed(digits));
}
♻️ 唯一性与去重
当需要生成“互不重复”的随机数时:
- 目标数量 ≪ 可选空间:可先生成后去重,失败重试。
- 目标数量接近空间大小:应使用洗牌(Fisher–Yates)或序列打乱。
// Fisher–Yates 洗牌
function shuffle(arr) {
for (let i = arr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[arr[i], arr[j]] = [arr[j], arr[i]];
}
return arr;
}
📏 分布与偏差
Math.random() 近似均匀分布,但在实际采样与离散化(如 floor)过程中要注意边界偏差,尽量统一使用 [min, max) 半开区间定义。
🔐 安全相关
不要将 Math.random() 用于安全场景(令牌、密码)。应使用:
// 浏览器:加密随机
const buf = new Uint32Array(1);
crypto.getRandomValues(buf);
// Node.js:加密随机
const { randomBytes } = require('crypto');
const token = randomBytes(16).toString('hex');
🔗 相关工具
需要批量生成整数/小数,并支持唯一性、排序与统计?试试 随机数生成器。