新闻详情

新闻详情

首页 / 资讯中心 / 详情

Modern JavaScript 教程:用 `Math.random()` 生成 `[min, max)` 区间的随机浮点数

发布时间:2026/10/1 2:07:54来源:尧图网络
Modern JavaScript 教程:用 `Math.random()` 生成 `[min, max)` 区间的随机浮点数
文档/教程前端【免费下载链接】en.javascript.infoModern JavaScript Tutorial项目地址https://gitcode.com/gh_mirrors/en/en.javascript.info点击查看免费下载Math.random()只能产生0到1不含1之间的随机数而实际业务中往往需要任意区间的随机值。本文以《Modern JavaScript Tutorial》en.javascript.info中「A random number from min to max」练习的标准解法为骨架深入讲解如何通过两步线性映射把[0, 1)均匀映射到[min, max)并给出可直接运行的实现、边界语义分析以及向随机整数场景的扩展方案。任务背景写出random(min, max)函数在教程 8-random-min-max/task.md 中题目给出了明确需求内置函数Math.random()会产生一个0到1之间不含1的随机值请编写函数random(min, max)用于生成从min到max不含max的随机浮点数。期望的运行效果如下alert( random(1, 5) ); // 1.2345623452 alert( random(1, 5) ); // 3.7894332423 alert( random(1, 5) ); // 4.3435234525可以看到每次调用返回的数值不同且总是落在[1, 5)这个区间内。这是一个非常典型的区间缩放interval mapping问题也是后续很多随机数场景的基础。基础Math.random()的取值语义在章节正文 article.md 的「Other math functions」一节中教程对Math.random()做了如下定义Returns a random number from 0 to 1 (not including 1).即Math.random()返回[0, 1)区间内近似均匀分布的浮点数最小值可以取到0但最大值严格小于1alert( Math.random() ); // 0.1234567894322 alert( Math.random() ); // 0.5435252343232 alert( Math.random() ); // ... (any random numbers)理解「不含1」这一点非常关键它决定了区间映射公式的写法也决定了最终结果为什么「不含max」。核心解法两步线性映射标准解法的思路记录在 8-random-min-max/solution.md 中把0..1区间内的所有取值整体「映射」到min..max区间。整个过程可以拆成两步放大区间将[0, 1)乘以(max - min)取值区间随之从[0, 1)变为[0, max - min)平移起点再加上min取值区间就变成了[min, max)。用数学语言表达就是一次仿射变换affine transformationrandom min Math.random() * (max - min)之所以先乘后加是因为乘法负责「拉伸」区间长度加法负责「移动」区间起点两者次序不能颠倒。写成完整函数即为function random(min, max) { return min Math.random() * (max - min); } alert( random(1, 5) ); alert( random(1, 5) ); alert( random(1, 5) );以random(1, 5)为例验证映射过程Math.random()取到0时结果为1 0 * 4 1恰好等于下界minMath.random()无限接近1时结果无限接近1 4 5但永远达不到maxMath.random()取中间值0.5时结果为1 2 3正好是区间的中点。由于Math.random()在整个[0, 1)上是近似均匀分布的线性映射不会改变分布形态因此生成的结果在[min, max)区间内也是均匀分布的。边界语义为什么结果「不含 max」这是本题最容易踩的坑。由于Math.random()的取值范围是[0, 1)上界开区间经过min Math.random() * (max - min)变换后结果的取值范围是[min, max)即min是可能取到的当Math.random()返回0时max永远取不到因为Math.random()严格小于1。这与题目的要求「frommintomax(not includingmax)」完全一致。理解开区间与闭区间的差别有助于在后续实现随机整数时避免概率不均的错误详见下文扩展。实战扩展生成[min, max]的随机整数本练习的解法可以直接作为下一题「A random integer from min to max」的基础——在 9-random-int-min-max/task.md 中明确说明You can use the solution of the previous task as the base。错误的直觉方案最直觉的做法是先按本公式生成浮点数再Math.round()取整但这是错误的function randomInteger(min, max) { let rand min Math.random() * (max - min); return Math.round(rand); } alert( randomInteger(1, 3) );问题在于Math.round()的取整规则会让边缘值min和max的概率只有中间值的一半。以randomInteger(1, 3)为例各取值对应的浮点区间为values from 1 ... to 1.4999999999 become 1 values from 1.5 ... to 2.4999999999 become 2 values from 2.5 ... to 2.9999999999 become 31和3各自只覆盖长度约0.5的区间而2覆盖了长度1的区间因此多次运行后2出现的频率明显更高分布不均匀。完整的分析与解法参见 9-random-int-min-max/solution.md。正确的整数方案解决方案之一是对区间边界做调整让每个整数对应的浮点区间等长function randomInteger(min, max) { // now rand is from (min-0.5) to (max0.5) let rand min - 0.5 Math.random() * (max - min 1); return Math.round(rand); }另一种等价做法是使用Math.floor把取值范围扩到[min, max1)function randomInteger(min, max) { // here rand is from min to (max1) let rand min Math.random() * (max 1 - min); return Math.floor(rand); }此时各整数的映射区间完全等长values from 1 ... to 1.9999999999 become 1 values from 2 ... to 2.9999999999 become 2 values from 3 ... to 3.9999999999 become 3所有区间长度相同最终分布才是均匀的。可以看到浮点版本中「不含 max」的边界语义在整数版本中通过把区间右端扩展为max 1来补偿。使用注意事项参数顺序约定本教程约定min max。如果传入min max公式依然会返回一个区间内的数值但区间方向会反转通常不符合预期建议在调用侧自行保证min max。返回类型公式返回的是浮点数。若业务需要整数应参考上文整数版本的实现而不是直接Math.round()否则会破坏均匀性。均匀性前提映射公式假设Math.random()在[0, 1)上近似均匀。线性变换只是缩放和平移不改变均匀性但 JavaScript 内置的伪随机数生成器并非密码学安全不适合用于抽奖、加密等对随机性要求严格的场景。可复用的基础能力min Math.random() * (max - min)这一公式是「区间映射」的最小实现在本仓库中还被多处类似任务复用例如随机整数任务 9-random-int-min-max/task.md 即以此为基础展开。小结本文围绕《Modern JavaScript Tutorial》中「A random number from min to max」的标准解法完整覆盖了从任务定义task.md到两行核心实现solution.md的完整链路Math.random()返回[0, 1)区间内的随机浮点数通过min Math.random() * (max - min)的两步线性映射可生成[min, max)区间内均匀分布的随机浮点数结果不含max是由Math.random()的开区间上界直接决定的生成均匀随机整数时需要调整区间边界或改用Math.floor避免Math.round()造成的边缘概率偏差。掌握这一公式即可作为任意随机数生成需求的通用起点。赞分享文档/教程前端【免费下载链接】en.javascript.infoModern JavaScript Tutorial项目地址https://gitcode.com/gh_mirrors/en/en.javascript.info点击查看免费下载相关推荐freeCodeCamp 通关实战用 Math.random 与 Math.floor 生成任意区间内的随机整数freeCodeCamp 通关实战用 Math.random 与 Math.floor 生成任意区间内的随机整数 本篇技术指南以 freeCodeCamp J前端后端教育freeCodeCamp Basic JavaScript 全解析用 Math.random() 与 Math.floor() 生成 0–9 的随机整数freeCodeCamp Basic JavaScript 全解析用 Math.random 与 Math.floor 生成 0–9 的随机整数 本篇技术指南前端后端教育揭秘 crypto-js 随机数生成从 Math.random() 到 crypto.getRandomValues揭秘 crypto js 随机数生成从 Math.random 到 crypto.getRandomValues 你还在使用 Math.random 生成加密密码学上一篇解决微服务消息可靠性痛点Disque可观测性集成实践下一篇Linkbricks-Llama3.2-Korean-cpt-3b模型架构深度剖析从Llama-3.2到韩语CPT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

HarmonyOS 7 Share Kit:精准碰一碰目标坐标路由与重复投递幂等控制【鸿蒙心迹】 2026/10/1 8:11:03

HarmonyOS 7 Share Kit:精准碰一碰目标坐标路由与重复投递幂等控制【鸿蒙心迹】

这次我没有把“碰一碰”当成一个更快的分享按钮,而是把它放进一个素材看板里:手机里的照片碰到平板指定卡片,文件要落到正确位置;即使底层事件重复回调,也只能真正提交一次。 一、问题不是把文件传过去,而是…

阅读更多 →
Chatto机器人开发实战:Bot Accounts、Webhook与最小权限RBAC配置指南 2026/10/1 8:11:03

Chatto机器人开发实战:Bot Accounts、Webhook与最小权限RBAC配置指南

Chatto机器人开发实战:Bot Accounts、Webhook与最小权限RBAC配置指南 【免费下载链接】chatto A fully-featured team and group chat application that you can easily selfhost. 项目地址: https://gitcode.com/gh_mirrors/chatt/chatto Chatto 是一款功能…

阅读更多 →
从零到上线:AI工程师的LLM应用工程化实践指南 2026/10/1 8:10:56

从零到上线:AI工程师的LLM应用工程化实践指南

ai-engineering 这个词最近两年几乎成了招聘网站上的万能标签,但我见的更多的,是被这个标签吸引、却不知道从哪下手的人。我自己当初也是从零开始:不会训练模型,没读过完整的 transformer 论文,甚至没搞懂 attention 机…

阅读更多 →
自研远程桌面工具排错手册与已知限制 2026/10/1 8:10:56

自研远程桌面工具排错手册与已知限制

05-排错手册与已知限制:从连不上到点击偏移的定位思路 前面四篇把"怎么做出来"讲完了。最后这篇讲两件新手最容易用上的事:真出问题了怎么定位,以及这个工具坦率承认自己有哪些做不到。一个负责任的项目,不该只晒能力&a…

阅读更多 →
从零搭建AI应用:AI工程化全链路实战指南 2026/10/1 8:10:56

从零搭建AI应用:AI工程化全链路实战指南

2023年底到2024年,AI这个圈子几乎是一夜之间从"会写模型"卷到了"会做工程"。很多人找我聊的第一句话都是:我现在能跑通别人的模型demo,但真要自己从零搭一个能上线的AI应用,感觉完全没头绪。这个"ai-eng…

阅读更多 →
Qwen-Image-2.1电商产品图实战:从提示词设计到ComfyUI批量部署 2026/10/1 8:10:55

Qwen-Image-2.1电商产品图实战:从提示词设计到ComfyUI批量部署

做电商设计这些年,我一直在找一个真正能理解"商品语言"的AI绘图工具。用过好几款主流文生图模型,出风景、出人像都不错,但一到产品图就容易翻车:瓶身的反光塑料感、面料的纹理糊成一团、五金件的金属质感发飘……直到我…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉