随机数生成实战:整数、浮点、小数精度与唯一性

系统性理解随机数生成的边界、分布、唯一性与工程实践

优兔GOGO
2025年10月9日
开发教程
随机数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));
}

♻️ 唯一性与去重

当需要生成“互不重复”的随机数时:

  1. 目标数量 ≪ 可选空间:可先生成后去重,失败重试。
  2. 目标数量接近空间大小:应使用洗牌(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');

🔗 相关工具

需要批量生成整数/小数,并支持唯一性、排序与统计?试试 随机数生成器