我知道您可以使用此函数在一定范围内在 JavaScript 中生成一个随机数:
function getRandomInt (min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
由 Ionuş G. Stan 提供 here .
我想知道的是,您是否可以使用 crypto.getRandomValues() 在一个范围内生成一个更好 的随机数而不是 Math.random()。我希望能够生成一个介于 0 和 10 之间的数字,包括 0 到 10,或者 0 - 1,甚至 10 - 5000,包括边界值。
您会注意到 Math.random() 生成的数字类似于:0.8565239671015732。
getRandomValues API 可能会返回如下内容:
- 231 与
Uint8Array(1)
- 54328 与
Uint16Array(1)
- 355282741 与
Uint32Array(1)
。
那么如何将其转换回十进制数,以便我可以使用上面相同的范围算法?还是我需要一种新算法?
这是我试过的代码,但效果不是很好。
function getRandomInt(min, max) {
// Create byte array and fill with 1 random number
var byteArray = new Uint8Array(1);
window.crypto.getRandomValues(byteArray);
// Convert to decimal
var randomNum = '0.' + byteArray[0].toString();
// Get number in range
randomNum = Math.floor(randomNum * (max - min + 1)) + min;
return randomNum;
}
在低端(范围 0 - 1),它返回的 0 多于 1。使用 getRandomValues() 的最佳方法是什么?
非常感谢
最佳答案
恕我直言,描述了使用 window.crypto.getRandomValues()
在 [min..max]
范围内生成随机数的最简单方法 here .
ECMAScript 2015 语法代码,如果链接是 TL;TR:
function getRandomIntInclusive(min, max) {
const randomBuffer = new Uint32Array(1);
window.crypto.getRandomValues(randomBuffer);
let randomNumber = randomBuffer[0] / (0xffffffff + 1);
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(randomNumber * (max - min + 1)) + min;
}
关于Javascript:使用 crypto.getRandomValues 生成一个范围内的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18230217/