Javascript Node.js加密缓冲区中的安全随机浮点
当然,这不是出于任何实际目的,但我尝试使用节点的模块生成一个安全的随机浮点数。基本上,以下是:Javascript Node.js加密缓冲区中的安全随机浮点,javascript,node.js,random,binary,buffer,Javascript,Node.js,Random,Binary,Buffer,当然,这不是出于任何实际目的,但我尝试使用节点的模块生成一个安全的随机浮点数。基本上,以下是: var crypto = require('crypto'); var buf = crypto.randomBytes(4); var float = buf.readFloatBE(); 就以下测试所知,平均0.40%的情况下,这不起作用。我得到的不是浮点数,而是NaN var colors = require('colors'); var crypto = require('crypto');
var crypto = require('crypto');
var buf = crypto.randomBytes(4);
var float = buf.readFloatBE();
就以下测试所知,平均0.40%的情况下,这不起作用。我得到的不是浮点数,而是NaN
var colors = require('colors');
var crypto = require('crypto');
var buf = new Buffer(4);
var fails = 0, tries = 100000;
var failures = [];
for (var i = 0; i < tries; i++) {
var num = crypto.randomBytes(4).readFloatBE(0);
try {
buf.writeFloatBE(num, 0);
} catch (e) {
fails++;
failures.push(buf.readUInt32BE(0).toString(2));
}
}
var percent = 100 * fails / tries;
if (fails)
percent = (percent.toFixed(2) + "%").red;
else
percent = '0.00%'.blue.bold;
console.log('Test ' + 'complete'.green.bold + ', ' + percent + ": " + fails + " / " + tries);
fails && console.log('Failed'.red + ' values:', failures.join(', '));
var colors=require('colors');
var crypto=require('crypto');
var buf=新缓冲区(4);
var失败=0,尝试次数=100000;
var失效=[];
for(var i=0;i
我猜这是由于IEEE单精度浮点数规范,但我不太清楚浮点是如何存储为二进制的
确切地说,为什么会发生这种情况?除了简单地生成浮点数,直到得到一个有效的数字,我如何才能避免这种情况
编辑:查看过滤后的二进制数据时,它们似乎都遵循相同的模式:前8位都已设置。其他一切都是随机的。从当前版本的node中可以明显看出,
noAssert
在第906行指定,noAssert
还检查所提供的数字是否不是NaN
,因此只需指定noAssert
即可写入无穷大,NaN
,和-Infinity
到缓冲区。看起来0x7F800000
是无穷大,0xFF800000
是-Infinity0b*11111111
后跟23位,如果设置了至少一个if,则结果为NaN
。