JS getRandomValues和Math.random方法深入解析
作者:不裁_caiii 发布时间:2024-04-17 09:54:42
Math.random()
Math.random()是JavaScript默认提供的生成随机数的方法。该方法返回一个0到1之间的浮点数,其值由伪随机算法产生。换言之,它并非真正的随机数,而是使用数学函数和时间戳等系统变量来模拟随机性。因此,尽管可能看起来相当随机,但它的输出结果并不能保证完全随机或安全可靠。例如,如果连续调用Math.random()方法多次,会发现它返回的值存在某些明显的重复性。以下是一些生成随机整数的通常方法:
// 生成0~9之间的随机整数
Math.floor(Math.random() * 10)
// 生成1~10之间的随机整数
Math.floor(Math.random() * 10) + 1
// 生成100~200之间的随机整数
Math.floor(Math.random() * 101) + 100
需要注意的是,Math.random()方法并不具备足够的安全性,如需保证应用程序的安全性,请勿使用该方法生成密码、加密密钥等关键数据。此外,在JavaScript中访问数学随机数发生器时,可能由于算法和实现上的问题而受到攻击,并导致产生可预测的序列。因此,如果需要在应用程序中生成安全可靠的随机数,请考虑使用Crypto API中的getRandomValues()方法。
Crypto API 中的 getRandomValues()
getRandomValues()是由浏览器提供的一种更为安全和随机的方法,它可以用于生成高质量的伪随机数。与Math.random()方法不同,getRandomValues()使用真正的随机性源来生成随机数。这些随机性源通常被称为“熵池”,它们由多个不可预测的因素组成,例如硬件噪声、鼠标移动等。在实际使用中,getRandomValues()的输出结果始终是随机的,并且没有明显的重复性。
以下是一些使用Crypto API的getRandomValues()方法生成随机整数的通常示例:
// 生成一个32位的随机整数数组
const buffer = new Uint32Array(1);
window.crypto.getRandomValues(buffer);
console.log(buffer[0]);
// 生成1~10之间的随机整数
let randomNumber;
do {
randomNumber = window.crypto.getRandomValues(new Uint32Array(1))[0];
} while (randomNumber > 4294967295 - (4294967295 % 10))
randomNumber %= 10;
randomNumber += 1;
console.log(randomNumber);
需要注意的是,getRandomValues()方法需要浏览器支持Web Cryptography API,并且无法在Node.js应用程序中使用。
安全性
在讨论随机数生成方法时,必须注意安全性。安全的随机数生成器是计算机科学中非常重要的部分,因为它们可以用于密码学、保密通信、数字签名等关键应用中。安全的随机数生成器必须能够产生完全不可预测的序列,并且不能受到攻击者的控制或影响。
Math.random()方法不能满足以上要求,因为它的输出结果是通过算法和时间戳等系统变量获得的。尽管看起来相当随机,但它并不安全可靠,并且可能会被恶意攻击者预测和利用。
相比之下,getRandomValues()方法使用真正的随机性源来生成随机数。它的输出结果是完全不可预测的,并且没有明显的重复性。如果需要在应用程序中生成安全可靠的随机数,请使用getRandomValues()方法。
性能
随机数生成器的性能也是一个重要的问题。在大多数情况下,JavaScript应用程序不需要高度安全的随机数,因此Math.random()方法可能是更好的选择。它简单易用,而且性能较好。
相比之下,getRandomValues()方法是一种复杂的随机数生成器,它需要耗费更多的时间和资源来获得真正的随机性源。因此,在编写轻量级或低优先级应用程序时,应该考虑使用Math.random()方法以获得更好的性能。但是,在涉及关键数据或强加密环境中,始终应使用getRandomValues()方法来保证安全可靠。
使用建议
在编写应用程序时,需要根据需求选择适当的随机数生成方法。以下是一些建议:
如果需要生成简单的随机数序列,并且无需考虑安全性问题,则可以使用Math.random()方法。
如果需要生成安全可靠的随机数,例如加密密钥、数字签名等,请使用getRandomValues()方法。
当使用Math.random()方法时,请确保随机数满足统计分布的要求,并避免出现可预测的序列。
如果需要高质量的随机数并且没有安全性问题,请考虑使用第三方的随机数生成器库。
来源:https://juejin.cn/post/7221711920511631415


猜你喜欢
- 一下demo演示2.0中的vue-router是如何获取到不同参数的,并在地址栏中匹配不同的信息 <!DOCTYPE html>
- 分区表的概念 分区致力于解决支持极大表和索引的关键问题。它采用他们分解成较小和易于管理的称为分区的片(piece)的方法。一旦分区被定义,S
- 本文实例讲述了python通过colorama模块在控制台输出彩色文字的方法。分享给大家供大家参考。具体分析如下:colorama是一个py
- uuid str int 之间的转换import uudi#str 转 uuiduuid.UUID('123456781234567
- 本文实例为大家分享了python爬取51job中hr的邮箱具体代码,供大家参考,具体内容如下#encoding=utf8import url
- 链接中的例子是一些脚本攻击相关的内容,有时间的朋友可以点开看看。 1.不要相信Request.QueryString: 相信在asp时代,这
- 要调用RPC接口,python提供了一个框架grpc,这是google开源的rpc相关文档:https://grpc.io/docs/tut
- 本文介绍了一个较为通用的获取 checkbox 值的方法,希望对新手有用。<script type="text/javasc
- 一、连接数据库格式:mysql -h主机地址 -u用户名 -p用户密码1.1.连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录my
- 本文实例讲述了Go语言写入字符串到文件的方法。分享给大家供大家参考。具体实现方法如下:package mainimport &q
- 在网上搜索的时候,经常看到两种打开方式: dispatch和EnsureDispatchimport win32com.client as
- 转用一门新语言通常是一项大决策,尤其是当你的团队成员中只有一个使用过它时。今年 Stream 团队的主要编程语言从 Python 转向了 G
- 在浏览器 IE6 、IE7、Firefox2+、Firefpx3+、Opera9.6+、Safari3.1+中测试以下代码:<!DOC
- 一、Python urllib 模块是什么urllib 模块是 Python 标准库,其价值在于抓取网络上的 URL 资源,入门爬
- ul设置浮动后不能自适应高度,也就是不能撑开父容器,不能自适应内容的高度。解决方法是在ul结束标签前加个清除浮动。 &
- //定义编码header( 'Content-Type:text/html;charset=utf-8 ');//Atomh
- 利用三元运算符实现登录注册效果切换,供大家参考,具体内容如下直接上代码wxml:<view class='top'&g
- 优化的思路一般是: 第一个是尽量降低向客户端同步对象的数量,第二个是尽量降低单个对象向客户端同步的数据."九宫格"是最常
- 区别:xx:公有变量,所有对象都可以访问;xxx:双下划线代表着是系统定义的名字。__xxx:双前置下划线,避免与子类中的属性命名冲突,无法
- 我用 python 写了一些脚本,有一些是爬虫脚本,比如爬取知乎特定话题的热门问题,有一些是定期的统计分析脚本,输出统计结果到文档中。之前我