【问题标题】:How to get a cryptographically strong number in the range [0,1)?如何获得 [0,1) 范围内的加密强数?
【发布时间】:2015-01-26 15:44:29
【问题描述】:

我一直在尝试创建一个函数,该函数将通过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() 方法,因为我希望为我正在尝试执行的操作提供安全号码。

【问题讨论】:

标签: javascript random cryptography


【解决方案1】:

为什么不简化一些事情

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

这是怎么回事?

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

【讨论】:

  • 谢谢! 0x100000000 是什么意思?我只写了一点代码,从来没有被正式教过。
  • @ConorO'Brien 是 4294967296 的十六进制表示法,这是特殊的,因为它是 Math.pow(2, 32),即 32 位整数可以具有的不同值的数量
  • 再次感谢您所做的一切!
  • @ConorO'Brien 哦,帮助您更好地理解,0x 开头只是我们说“这是一个十六进制文字”,然后后面的每个数字都会在 [0-9A-F] 中,其中A 表示10B11 ... F15。最后,现在每一列都是16s 而不是10s,即十六进制的10 是十二进制的16。它对计算机非常有用,因为 16 是 2 的幂(16 * 16 - 1FF = 255,即一个字节的最大值),这是计算机使用的,所以你基本上是在用速记形式编写计算机有用的二进制文件。
  • 这不使用双尾数提供的全部 53 位。我更喜欢生成两个 UInt32 值并将它们组合起来,或者生成一个 64 位值。
猜你喜欢
  • 2011-11-06
  • 2020-07-19
  • 2020-07-22
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多