- 教程
- 文档
【免费下载链接】30-seconds-of-code
Coding articles to level up your development skills
本篇指南以 30 seconds of code 仓库中的 random-number-or-integer-in-range 为骨架,完整讲解如何基于原生Math.random()通过简单数学运算生成任意闭区间[min, max]内的随机浮点数、随机整数,以及利用 Box-Muller 变换生成高斯(正态)分布随机数。读完你将得到可直接复制进项目的三行级工具函数,并理解其边界语义、取整陷阱与适用场景。
起点:理解Math.random()的输出域
JavaScript 内置的Math.random()会返回一个大于等于 0 且小于 1的伪随机浮点数,即值域为[0, 1)。它在 30 seconds of code 仓库中被视为随机值工具函数的核心原料——仓库在 javascript.yaml 中记录了Math.random()的标准引用,而 random-value-generators 集合 下的随机布尔、随机十六进制颜色、随机字母数字串、UUID 等 snippet 全部建立在它的基础之上。
直接使用Math.random()只能得到[0, 1)区间的小数,想要"某个范围内的随机数",就需要用线性映射把输出域搬移到目标区间。
区间内随机浮点数:randomNumberInRange(min, max)
生成指定区间内随机浮点数是最简单的映射场景:用Math.random()的结果乘以最大值与最小值的差,再加上最小值即可:
const randomNumberInRange = (min, max) => Math.random() * (max - min) + min; randomNumberInRange(2, 10); // 6.0211363285087005推导过程如下:
Math.random()产出[0, 1);- 乘以
(max - min)后得到[0, max - min); - 加上
min后得到[min, max)。
注意该结果是左闭右开的:理论上可以等于min(当Math.random()返回 0 时),但永远取不到max。对浮点数场景(如随机角度、随机坐标偏移)这通常无关紧要。
参数与边界说明
| 参数 | 含义 | 说明 |
|---|---|---|
min | 区间下限 | 结果可取到该值,需为有限数值 |
max | 区间上限 | 结果取不到该值(开区间上界) |
| 返回值 | [min, max)内的浮点数 | 精度取决于Math.random()的 53 位尾数 |
当max < min时公式仍会给出一个递减区间内的值;当min === max时恒返回min。从仓库实现看,该函数是箭头函数单表达式写法,未做参数校验,实际使用时若需处理非法输入可自行补充防御性判断。
区间内随机整数:randomIntegerInRange(min, max)
生成随机整数与浮点版本非常相似,只多了最后一步:用Math.floor()将结果向下取整。但关键的差异在于乘数要使用(max - min + 1),否则上界会出现偏差:
const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; randomIntegerInRange(0, 5); // 2为什么是(max - min + 1)而不是(max - min)
若沿用浮点版本的max - min,则Math.random() * (max - min)最多接近max - min,经Math.floor()后最大只能得到min + (max - min - 1),上界max永远不会出现。把差值加 1,使乘数范围变为[0, max - min + 1),Math.floor()之后即可完整覆盖min到max的每一个整数(含两端),即闭区间[min, max]。
为什么用Math.floor()而非Math.round()
Math.round()会引入边界不对称:区间首尾整数出现的概率只有中间整数的一半(例如round(0.5)与round(1.4)均可能落到 1,但 0 和 5 的命中区间被截断)。Math.floor()配合(max - min + 1)能保证每个整数等概率,这是均匀随机整数实现的正确姿势。
进阶:Box-Muller 变换生成高斯随机数
均匀分布之外,某些模拟场景(如噪声、评分波动、参数扰动)需要正态分布(高斯分布)的随机数。30 seconds 的该文档给出基于 Box-Muller 变换的实现:用两个独立的均匀随机数,通过对数与三角运算映射出标准正态分布样本:
const randomGauss = () => { const theta = 2 * Math.PI * Math.random(); const rho = Math.sqrt(-2 * Math.log(1 - Math.random())); return (rho * Math.cos(theta)) / 10.0 + 0.5; }; randomGauss(); // 0.5逐行原理拆解
theta = 2 * Math.PI * Math.random():在[0, 2π)内取随机角度;rho = Math.sqrt(-2 * Math.log(1 - Math.random())):1 - Math.random()保证对数参数严格落在(0, 1](避免取到 0 导致-∞),再经平方根得到服从瑞利分布的半径;(rho * Math.cos(theta)) / 10.0 + 0.5:rho * cos(theta)即标准正态样本(均值 0、方差 1),除以10.0压缩方差、加上0.5平移均值,最终落在 0.5 附近的高斯分布。
仓库通过 redirects.yaml 保留了random-gauss、random-integer-in-range、random-number-in-range三个旧路径到本文档的 301 重定向,说明这份实现是该主题在项目中的唯一权威版本,社区历史版本已被收敛至此。
组合复用:一次生成一整个随机整数数组
掌握了单值生成,批量场景即可顺势扩展。仓库中的姊妹篇 random-integer-array-in-range 正是复用randomIntegerInRange的核心逻辑,用Array.from()与映射函数批量产出:
const randomIntArrayInRange = (min, max, n = 1) => Array.from( { length: n }, () => Math.floor(Math.random() * (max - min + 1)) + min ); randomIntArrayInRange(12, 35, 10); // [ 34, 14, 27, 17, 30, 27, 20, 26, 21, 14 ]第三个参数n默认值为 1,代表返回数组长度。该函数与本文两个函数同属于 random-value-generators 集合,集合还包含随机布尔、随机字母数字串、随机十六进制颜色与 UUID 生成器,可作为随机值工具库的整体清单查阅。
安全提醒:Math.random()的适用边界
必须明确的是,Math.random()是非加密安全的伪随机数生成器,输出的可预测性与统计特性不适合用于密码学、Token、抽奖防作弊等安全敏感场景。仓库在处理此类需求时的做法是转向Crypto API——例如 uuid-generator 中,现代浏览器与 Node.js 优先使用crypto.randomUUID(),旧环境则用crypto.getRandomValues()配合位运算生成。选型建议:
- 动画、游戏、抽样、UI 随机效果 →
Math.random()系函数(本文方案); - 密码学安全随机 →
crypto.randomUUID()/crypto.getRandomValues()。
仓库位置速查
- 主文档:random-number-or-integer-in-range.md
- 所属集合:random-value-generators.yaml
- 姊妹实现:random-integer-array-in-range.md、random-boolean.md、random-alphanumeric.md、random-hex-color-code.md
- 语言引用表:javascript.yaml(
Math.random()官方语义参照) - 旧路径重定向:redirects.yaml
本文全部函数均不依赖任何外部库,可直接复制进浏览器控制台或 Node.js 脚本运行验证,是日常开发中最轻量的随机数工具集。
- 教程
- 文档
【免费下载链接】30-seconds-of-code
Coding articles to level up your development skills
相关推荐
30 seconds of code:用 JavaScript 生成指定范围内的随机整数数组(randomIntArrayInRange 全解析)
30 seconds of code:用 JavaScript 生成指定范围内的随机整数数组(randomIntArrayInRange 全解析) 导读 在 J
教程文档30 Seconds of Code 实战:用 JavaScript 生成指定长度的随机字母数字字符串
30 Seconds of Code 实战:用 JavaScript 生成指定长度的随机字母数字字符串 导读 本文以 30 seconds of code 仓库
教程文档30-seconds-of-code 实战:JavaScript 数组的抽样、洗牌与加权随机选择
30 seconds of code 实战:JavaScript 数组的抽样、洗牌与加权随机选择 导读 在处理 JavaScript 数组时,随机取值与洗牌是高
教程文档
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考