Javascript:使用 crypto.getRandomValues 生成一个范围内的随机数

标签 javascript random cryptography range

我知道您可以使用此函数在一定范围内在 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 可能会返回如下内容:

  • 231Uint8Array(1)
  • 54328Uint16Array(1)
  • 355282741Uint32Array(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/

相关文章:

javascript - 我想在用户打开谷歌表单时引发一个事件?

python - 在python中生成一个随机的非质数

python - 计算用户密码和随 secret 码的熵

java - SSLSocket 通过另一个 SSLSocket

encryption - 使用 SHA-1 散列作为 AES key

javascript - 在 JavaScript 中检查单选按钮是否已选中/未选中的函数

javascript - 当我们返回一个值以及从微任务队列中的 then() 链返回 Promise.resolve 时会发生什么?

javascript - 如何更改 jQuery Ajax 完成回调参数

linux - 是否有机会两次读取 16 字节/dev/urandom 数据,并获得相同的结果?

java - 如何解密在 Laravel 中使用 Crypt 加密的 Java (Android) 文本?