在实现Mersenne Twister时,这个数字应该减去1吗



我在网上发现了这个片段,以及将其转换为TypeScript类的Stackoverflow帖子。

我基本上是逐字复制粘贴的(因为我没有资格修改这种密码(,但我注意到VS code在最后一个函数中有一点下划线:

/**
* generates a random number on [0,1) with 53-bit resolution
*/
nextNumber53(): number {
let a = this._nextInt32() >>> 5;
let b = this._nextInt32() >>> 6;

return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0);
}

特别是9007199254740992.0

VS代码显示Numeric literals with absolute values equal to 2^53 or greater are too large to be represented accurately as integers.ts(80008)

我注意到,如果我把这个数字减去一,改为9007199254740991.0,那么警告就会消失。但如果这确实是一个显著的差异,我不一定想修改代码并破坏它。

基本上,我不确定,因为虽然我的直觉说数字溢出是不好的,但我的直觉说我不应该试图修复发布在几个地方的密码,因为它可能是正确的。

但是是吗?还是应该把这个数字减去一?

9007199254740992是在[0,1(中使用统一值的正确值,即0.0 <= x < 1.0.

这只是自动化出错,这个值可以用JavaScriptNumber准确表示,即64位浮点。它只有253,二进制IEEE 754浮点对这种形式的数字没有问题(它甚至可以用32位浮点精确表示(。

使用9007199254740991将使范围[0,1],即0.0 <= x <= 1.0。大多数库在[0,1(中生成统一的值,其他发行版也是从中派生的,但很明显,您可以自由地做任何对您的应用程序最有利的事情

注意,获得最大值的实际机会是2-53(~1e-16(,所以你不太可能在实践中看到它。

相关内容

  • 没有找到相关文章

最新更新