Math.random是伪随机数生成器,不安全
在所有浏览器中获取0到1之间的浮点数并不直接使用window.crypto.getRandomValues()方法,因为该方法返回的是一个TypedArray,其中包含了生成的随机数。而要在所有浏览器中获取0到1之间的浮点数,可以使用以下代码:
function getRandomFloat() {
var array = new Uint32Array(1);
if (window.crypto && window.crypto.getRandomValues) {
window.crypto.getRandomValues(array);
} else if (window.msCrypto && window.msCrypto.getRandomValues) {
window.msCrypto.getRandomValues(array);
} else {
return Math.random();
}
return array[0] / 4294967295; // 2^32 - 1
}
上述代码首先创建一个Uint32Array类型的数组,然后通过检查浏览器是否支持window.crypto.getRandomValues()方法来选择使用哪个随机数生成方式。如果浏览器支持该方法,使用window.crypto.getRandomValues()方法生成随机数;如果不支持,则使用Math.random()方法生成随机数。
最后,将生成的32位无符号整数除以4294967295(即2^32 - 1),得到一个范围在0到1之间的浮点数。
请注意,这种方式并不是真正安全的加密级随机数生成,但在大多数情况下可以满足一般的随机数需求。如果需要更高安全性的随机数,建议在支持的浏览器中使用window.crypto.getRandomValues()方法。