看起来Math.random()生成范围为[0,1)的64位浮点数,而新的crypto.getRandomValues()API仅返回整数.使用此API在[0,1)中生成数字的理想方法是什么?
这似乎有效,但似乎不是最理想的:
ints = new Uint32Array(2)
window.crypto.getRandomValues(ints)
return ints[0] / 0xffffffff * ints[1] / 0xffffffff
Run Code Online (Sandbox Code Playgroud)
编辑:澄清一下,我试图产生比Math.random()更好的结果.根据我对浮点的理解,应该可以获得52位随机性的完全随机分数.(?)
编辑2:为了给出更多背景知识,我不是要尝试以密码方式安全做任何事情,但有很多关于Math.random()实施不当的轶事故事(例如http://devoluk.com/google-chrome -math-random-issue.html)所以如果有更好的选择,我想使用它.
这是我尝试用我自己的Cryptography.random()替换Math.random().我的代码是否会生成加密安全的随机数,您是否看到了优化的机会?
NodeCrypto = require('crypto');
Cryptography = function() {
}
Cryptography.random = Promise.method(function() {
return new Promise(function(resolve, reject) {
NodeCrypto.randomBytes(4, function(ex, buffer) {
var hex = buffer.toString('hex');
var integer = parseInt(hex, 16);
var random = Number('0.'+integer);
resolve(random);
return random;
});
});
});
Run Code Online (Sandbox Code Playgroud)