我一直在尝试创建一个函数,该函数将通过 Window.crypto.getRandomValues() 函数返回 0(含)和 1(不含)之间的随机十进制数。目前,我的代码如下:

var rand = function(){
    var ra = window.crypto.getRandomValues(new Uint32Array(1))[0];
    function dec(n,m){
        return (n>=0&&n<=1)?n:dec(n/m,m);
    }
    return dec(ra,8);
}

我的问题是这不是均匀分布的;它往往在 0.2 和 0.7 之间,很少低于 0.2 和超过 0.7。有没有更好的方法来使用 .getRandomValues() 方法来获取类似 Math.random() 函数的数字?

我没有使用 .random() 方法,因为我希望为我尝试执行的操作提供安全号码。

最佳答案

为什么不简化事情

function cryptoRandom() {
    return window.crypto.getRandomValues(new Uint32Array(1))[0] / 0x100000000;
}

这里发生了什么?
  • 假设 window.crypto.getRandomValues 会给我们真正的随机位
  • 请求 32 位(无符号整数 i )
  • mini ium 值为 0x00000000 (或 0 )
  • maxi imum 值为 0xFFFFFFFF (或 4294967295 )
  • 将这些点变换到你想要的范围内; (i - min) / (max + 1)
  • 关于javascript - 如何获得 [0,1) 范围内的加密强数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27180914/

    10-12 14:10