☰
30 seconds of code 实战:用 JavaScript 在指定区间生成随机数与随机整数
2026/10/5 0:37:17 网站建设 项目流程
  • 教程
  • 文档

【免费下载链接】30-seconds-of-code

Coding articles to level up your development skills

项目地址:https://gitcode.com/gh_mirrors/30/30-seconds-of-code
点击查看免费下载

本篇指南以 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

项目地址:https://gitcode.com/gh_mirrors/30/30-seconds-of-code
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询