如何获得 [0,1] 范围内的加密强数字

How to get a cryptographically strong number in the range [0,1)?

本文关键字:范围内 加密 数字 何获得      更新时间:2023-09-26

我一直在尝试创建一个函数,该函数将通过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之间,很少低于.2和超过0.7。有没有更好的方法来使用 .getRandomValues() 方法来获取类似于 Math.random() 函数的数字?

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

为什么不简化事情

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

这是怎么回事?

  • 假设window.crypto.getRandomValues会给我们真正的随机位
  • 要求 32 位(无符号整数 i
  • imin鎓值为0x00000000(或0
  • imax imum 值为 0xFFFFFFFF(或 4294967295
  • 将这些点转换为您想要的范围; (i - min) / (max + 1)