新闻详情

新闻详情

首页 / 资讯中心 / 详情

JS 生成随机数与随机 ID,业务中常见错误写法

发布时间:2026/10/2 2:25:39来源:尧图网络
JS 生成随机数与随机 ID,业务中常见错误写法
1. 前言做前端开发这几年随机数和随机 ID 算是天天打交道的东西。从生成验证码、抽奖活动到给数据打唯一标识、做前端埋点几乎每个项目里都能见到它们的影子。可就是这么基础的功能我在 Code Review 里见过太多翻车写法有些甚至直接导致线上事故。今天就把这些常见坑整理出来聊聊正确姿势。2. 随机数基础Math.random() 的边界问题先看最基础的。很多人写随机整数喜欢这样// 错误写法直接乘再取整 function getRandomInt(max) { return Math.floor(Math.random() * max); }这段代码看着没问题但有两个隐患。第一Math.random()返回的是 [0, 1) 区间的小数理论上永远取不到 1所以Math.floor(Math.random() * max)的结果范围是 0 到 max-1如果你期望的是 1 到 max那就踩坑了。第二当 max 特别大时浮点数精度会导致分布不均匀某些数字出现的概率会偏高。更稳妥的写法是// 推荐写法明确区间 function getRandomInt(min, max) { min Math.ceil(min); max Math.floor(max); return Math.floor(Math.random() * (max - min 1)) min; }这样写的好处是区间明确调用方一眼就能看出取值范围不容易产生歧义。3. 随机 ID 生成Date.now() 的并发陷阱随机 ID 是重灾区。我见过不少同学图省事直接用时间戳当 ID// 错误写法时间戳直接当 ID const id Date.now();这个写法在单用户、单次操作场景下勉强能用但一旦遇到并发请求比如用户快速点击提交按钮或者多个标签页同时操作两个请求落在同一毫秒内ID 就重复了。更别说分布式环境下多台服务器同时生成碰撞概率直线上升。稍微好一点的做法是时间戳加随机数// 改进写法时间戳 随机数拼接 function generateId() { return Date.now().toString(36) Math.random().toString(36).slice(2); }这个方案把时间戳转成 36 进制缩短长度再拼一段随机字符串碰撞概率大幅降低。但要注意它仍然不是严格唯一的只是工程上够用。4. 随机 ID 生成Math.random() 做唯一标识的隐患还有更偷懒的直接用Math.random()生成 ID// 错误写法纯随机数当唯一 ID const id Math.random().toString(36).slice(2);这个写法的问题在于Math.random()是伪随机数生成器它的种子是固定的算法理论上存在周期性。虽然实际使用中很难触发但在安全敏感场景比如生成优惠券码、重置密码的 token这种写法是绝对不行的因为可预测性太强。安全场景必须用密码学安全的随机数// 安全写法crypto.getRandomValues function secureRandomId() { const arr new Uint32Array(4); crypto.getRandomValues(arr); return Array.from(arr, v v.toString(16)).join(); }这里用crypto.getRandomValues()生成 4 个 32 位无符号整数转成十六进制拼接安全性比Math.random()高好几个量级。浏览器环境直接可用Node.js 里用crypto.randomBytes()效果类似。5. 随机 ID 生成UUID 的正确打开方式如果项目对 ID 唯一性要求高直接用 UUID 是最省心的。但很多人不知道crypto.randomUUID()已经是现代浏览器的标准 API 了// 推荐写法原生 UUID const id crypto.randomUUID(); // 输出示例3f2c1a8e-7b4d-4f6a-9c3e-2d5b8a1f0e6a这个 API 在 HTTPS 环境下可用兼容性方面Chrome 92、Firefox 95、Safari 15.4 都支持。如果项目需要兼容老浏览器可以退而求其次用第三方库比如uuid包但要注意它内部也是基于crypto.getRandomValues实现的。6. 业务中的典型错误场景说几个我实际见过的线上事故都是随机数用错导致的。第一个是抽奖活动。运营配置了中奖概率 10%开发用Math.random() 0.1判断是否中奖看起来没问题。但活动上线后运营反馈中奖率明显偏低。排查发现开发把随机数生成放在了循环外面导致所有用户共用同一个随机数第一批用户抽完后面的用户结果全被复用了。第二个是前端埋点。给每次点击生成一个事件 ID用Date.now()拼接结果用户快速连点同一毫秒内产生多个事件ID 全部重复后端去重时把正常数据也误删了。第三个是列表渲染的 key。用Math.random()当 key每次渲染都重新生成导致 React 无法正确识别元素出现输入框失焦、滚动位置错乱等诡异问题。key 应该用稳定且唯一的标识而不是随机数。7. 总结随机数和随机 ID 看着简单用错地方就是事故现场。总结几条经验生成随机整数明确最小值和最大值别用裸Math.random() * max。并发场景别用Date.now()当 ID至少拼上随机数。安全敏感场景比如 token、验证码必须用crypto.getRandomValues()。唯一性要求高直接用crypto.randomUUID()别自己造轮子。React 列表 key 用稳定 ID别用随机数。写代码之前先想清楚这个随机数用在什么场景是追求性能、追求唯一性还是追求安全性选对方案才能少踩坑。希望这篇文章能帮大家避开这些常见的坑写出更健壮的代码。
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

微信小程序语音识别全链路实战:从录音到文字,PCM转换与讯飞接口对接 2026/10/2 3:30:54

微信小程序语音识别全链路实战:从录音到文字,PCM转换与讯飞接口对接

简介:这份资源面向微信小程序开发者,提供一套对接科大讯飞语音识别能力的完整集成方案,重点解决音频上传、语音提取、PCM格式转换与实时语音转文字等环节的落地问题,适合具备一定小程序开发基础、希望快速为应用添加语音交互功能的…

阅读更多 →
PyQt5与PyQtWebEngine版本兼容性排查指南 2026/10/2 3:30:53

PyQt5与PyQtWebEngine版本兼容性排查指南

1. 这不是“软件打不开”的简单故障,而是一场PyQt生态链的兼容性排查实战 Anaconda装完Spyder打不开——这句看似平平无奇的标题,背后藏着Python科学计算环境里最典型、也最容易被新手误判为“玄学”的一类问题。我从2016年开始带学生搭数据科学环境&am…

阅读更多 →
VSCode+ESP-IDF开发环境搭建避坑指南 2026/10/2 3:30:53

VSCode+ESP-IDF开发环境搭建避坑指南

1. 为什么选VSCode配ESP-IDF而不是Arduino IDE或PlatformIO? 我从2018年开始做ESP32项目,最早用Arduino IDE写温湿度节点,后来接米家Mesh要调底层Wi-Fi参数,Arduino那套封装直接卡死——连 esp_wifi_set_max_tx_power() 这种基…

阅读更多 →
从默认MySQL到按图索骥:一套可落地的数据库选型思考框架 2026/10/2 3:30:53

从默认MySQL到按图索骥:一套可落地的数据库选型思考框架

从"闭眼选MySQL"到"按图索骥":一套能落地的数据库选型思考框架这两年我参与了不少项目的技术评审,发现一个很普遍的现象:只要一说"上数据库",默认就是MySQL,再问为什么,回答…

阅读更多 →
有限元仿真软件全解析:主流工具盘点与选型避坑指南 2026/10/2 3:30:53

有限元仿真软件全解析:主流工具盘点与选型避坑指南

做机械、土木、汽车、航空这些方向的人,对“有限元仿真软件”这个词一定不陌生。不管是做毕业设计的学生,还是负责产品强度校核的工程师,手里基本都离不开这类工具。它解决的是一个非常现实的问题:一个零件、一台设备,…

阅读更多 →
mac协议与uuid算法组合:设备身份模拟与滑块轨迹生成实战 2026/10/2 3:30:47

mac协议与uuid算法组合:设备身份模拟与滑块轨迹生成实战

简介:这是一份聚焦MAC协议UUID算法、滑块算法及滑块环境算法的Go语言资源包,面向网络安全开发、爬虫逆向、自动化验证等方向的开发者,也适合对通讯识别与验证码抗自动化机制感兴趣的技术爱好者。内容围绕设备唯一标识生成、滑块轨迹模拟与环境…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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