Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js加密缓冲区中的安全随机浮点_Javascript_Node.js_Random_Binary_Buffer - Fatal编程技术网

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
是-Infinity
0b*11111111
后跟23位,如果设置了至少一个if,则结果为
NaN