0

0

js中如何生成随机数

月夜之吻

月夜之吻

发布时间:2025-08-24 14:02:01

|

1069人浏览过

|

来源于php中文网

原创

  1. 生成0到1之间的浮点数直接使用math.random();2. 生成0到max(不包含)的整数使用math.floor(math.random() max);3. 生成min到max之间包含边界的整数应使用math.floor(math.random() (max - min + 1)) + min,注意+1避免范围缺失;4. 安全敏感场景需用window.crypto.getrandomvalues()获取加密安全随机数,不可使用math.random();5. 避免使用math.round()导致分布偏斜,应使用math.floor()保证均匀分布;6. math.random()不可播种,如需可重现序列应引入第三方prng库;7. 注意浮点数精度限制和crypto api性能开销,在非安全场景优先使用math.random()以提升性能。上述实践覆盖了javascript中随机数生成的核心方法与常见陷阱,完整且准确地提供了从基础使用到高级注意事项的解决方案。

js中如何生成随机数

在JavaScript里,生成随机数主要依靠

Math.random()
这个内置函数。它会给你一个浮点数,范围在0(包含)到1(不包含)之间。如果需要整数,或者特定范围内的随机数,就需要结合
Math.floor()
做一些简单的数学运算。

js中如何生成随机数

解决方案

Math.random()
是我们生成随机数的核心。它返回的是一个伪随机浮点数,通常是这样的:
0.123456789...
,永远不会是1。

生成0到1之间的浮点数:

js中如何生成随机数
const randomFloat = Math.random();
console.log(randomFloat); // 比如:0.78912345

生成指定范围内的整数(包含最小值,不包含最大值):

如果你想得到一个0到

max
(不包含
max
)之间的整数,可以这样做:

js中如何生成随机数
// 生成0到9之间的整数(0-9)
const maxExclusive = 10;
const randomNumber = Math.floor(Math.random() * maxExclusive);
console.log(randomNumber); // 比如:5

这里,

Math.random() * maxExclusive
会得到一个0到
maxExclusive
(不包含
maxExclusive
)的浮点数,然后
Math.floor()
向下取整,就得到了我们想要的整数范围。

生成指定范围内的整数(包含最小值和最大值):

这可能是最常见的需求了,比如生成一个1到100之间的随机整数。这个公式稍微复杂一点,但非常实用:

// 生成1到100之间的整数(包含1和100)
function getRandomIntInclusive(min, max) {
  min = Math.ceil(min); // 确保最小值是整数
  max = Math.floor(max); // 确保最大值是整数
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

const minInclusive = 1;
const maxInclusive = 100;
const randomNumberInRange = getRandomIntInclusive(minInclusive, maxInclusive);
console.log(randomNumberInRange); // 比如:73

这里的逻辑是:

max - min + 1
计算出这个范围有多少个可能的整数(比如1到100,就是100-1+1=100个)。
Math.random()
乘以这个数量,得到一个0到这个数量(不包含)的浮点数。
Math.floor()
取整后,再加上
min
,就把这个0开始的范围平移到了我们想要的
min
max
的范围。

生成特定范围内的整数随机数,有什么最佳实践?

在我看来,生成特定范围内的整数,尤其是包含两端边界的,那个

Math.floor(Math.random() * (max - min + 1)) + min
的模式几乎就是标准答案了。我见过不少开发者,包括我自己,一开始会忘记那个
+1
,导致生成的随机数永远达不到
max
值,或者范围不对。这真的是个小细节,但影响挺大的。

Ecshop批量生成购买记录自动评价插件
Ecshop批量生成购买记录自动评价插件

本插件支持2.7.2和2.7.3最新UTF-8版本最新升级(2012-10-08)1.可以批量选择商品生成评价和购买记录2.可以灵活控制生成的购买数量和评价数量.真正的真实购买记录.( 新升级版本改动如下:生成评价的时候会随机隐藏某些评价.只生成购买记录(你也可以自己选择某些要隐藏的评价).这样购买数量和评价数量相差40%左右,提高真实性 )生成的购买数量和评价数量 是真正的黄金比例,进一步提高真

下载

一个好的实践是把它封装成一个可复用的函数,就像上面

getRandomIntInclusive
那样。这样不仅代码更整洁,也减少了每次手写时出错的概率。你甚至可以给它加上一些参数校验,比如确保
min
不大于
max
,或者处理非数字输入,让它更健壮。

另外,关于

Math.random()
,我们需要清楚它生成的是“伪随机数”。这意味着它并不是真正意义上的随机,而是通过一个确定性的算法生成的。对于大多数前端应用,比如抽奖、游戏骰子、生成验证码等,它的随机性已经足够了。但如果你的应用涉及到加密、安全令牌或任何需要高度不可预测性的场景,
Math.random()
就显得力不从心了。

如果我需要生成加密安全的随机数,JS中该怎么做?

当涉及到安全敏感的场景,比如生成会话ID、密码重置令牌、或者任何需要抵抗预测攻击的随机数据时,

Math.random()
是绝对不够的。这时候,我们就需要用到浏览器提供的
Web Cryptography API
,具体来说是
window.crypto.getRandomValues()

这个API与

Math.random()
最大的不同在于,它从系统底层的加密安全随机数生成器获取熵(entropy),因此生成的随机数是不可预测的,更适合安全用途。

使用

getRandomValues
稍微复杂一点,因为它需要一个类型化数组(TypedArray)作为参数,然后它会用随机字节填充这个数组。

// 生成一个16字节(128位)的加密安全随机数
function generateSecureRandomBytes(length) {
  const array = new Uint8Array(length); // 创建一个无符号8位整数数组
  window.crypto.getRandomValues(array); // 用加密安全的随机数填充它
  return array;
}

const secureBytes = generateSecureRandomBytes(16);
console.log(secureBytes); // 比如:Uint8Array [123, 45, 201, ...]

// 如果你需要一个加密安全的随机ID字符串,可以这样转换
function generateSecureRandomHex(length) {
  const bytes = generateSecureRandomBytes(length);
  return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');
}

const secureId = generateSecureRandomHex(16); // 生成一个32字符的十六进制随机ID
console.log(secureId); // 比如:a3f4e1c2d0b9a8f7e6d5c4b3a2f1e0d9

这里需要注意的是,

window.crypto.getRandomValues()
在Node.js环境中是不可用的,Node.js有自己的
crypto
模块来提供类似的功能(例如
crypto.randomBytes()
)。在浏览器端,这个方法是你的首选。它填充的是字节,所以如果你需要特定范围的数字,可能还需要做一些额外的转换,比如取模运算,但要小心潜在的偏斜问题。

生成随机数时,有哪些常见的“陷阱”或者我应该注意的地方?

除了前面提到的

+1
和加密安全性问题,还有几个点值得我们留意。

一个常见的“陷阱”是偏斜(Bias)。比如,有些人可能会尝试用

Math.round(Math.random() * max)
来生成随机数。但这样做会导致结果分布不均匀。
Math.round()
在0.5以下会舍去,0.5及以上会进位。这意味着0和
max
这两个端点被选中的概率只有其他数字的一半,因为它们只覆盖了半个范围。所以,始终坚持使用
Math.floor()
来处理随机浮点数到整数的转换,这是最稳妥的。

另一个问题是种子(Seed)

Math.random()
是无法“播种”的,这意味着你不能给它一个初始值,然后让它每次都生成同一串“随机”序列。这在某些场景下是个问题,比如你需要重现某个随机过程(在游戏测试中很常见),或者在分布式系统中生成可验证的随机数。如果你确实需要可播种的伪随机数生成器(PRNG),你可能需要引入第三方库,它们通常会实现一些经典的PRNG算法,比如Mersenne Twister。

还有就是浮点数精度。虽然

Math.random()
返回的是浮点数,但JavaScript的浮点数精度是有限的。对于大多数随机数生成的需求,这通常不是问题。但如果你在做一些非常精密的科学计算,或者需要极高精度的随机浮点数,就得注意了。不过,这在前端开发中相对不常见。

最后,就是性能考量

Math.random()
的性能非常好,因为它直接由JavaScript引擎实现。而
window.crypto.getRandomValues()
由于需要与操作系统底层交互,获取真正的熵,所以它的性能开销会比
Math.random()
大。在需要大量生成随机数,但又不需要加密安全性的场景,坚持使用
Math.random()
是明智的选择。反之,则必须优先考虑安全性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

407

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

251

2023.10.07

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

530

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

6204

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

492

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 4.3万人学习

XML教程
XML教程

共142课时 | 8.2万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号