Random 此RNG中是否应使用浮点或整数?
我用一个简单的函数来生成随机数。问题是,根据我是使用Random 此RNG中是否应使用浮点或整数?,random,multiplication,Random,Multiplication,我用一个简单的函数来生成随机数。问题是,根据我是使用float(在某些语言中称为Numbers)还是Ints // Variable definitions var _seed:int = 1; const MULTIPLIER:int = 48271; const MODULUS:int = 2147483647; // 0x7FFFFFFF (31 bit integer) // Inside the function return _seed = ((_seed * MULTIPLIER
float
(在某些语言中称为Numbers
)还是Ints
// Variable definitions
var _seed:int = 1;
const MULTIPLIER:int = 48271;
const MODULUS:int = 2147483647; // 0x7FFFFFFF (31 bit integer)
// Inside the function
return _seed = ((_seed * MULTIPLIER) % MODULUS) & MODULUS;
我遇到困难的部分是(\u seed*MULTIPLIER)
部分。如果\u seed
和MULTIPLIER
是int,则int*int
乘法会随之发生,大多数语言会给出一个int
。问题是,如果int
太大,则结果值会向下截断
这个整数溢出行为在RNGs中“应该完成”吗,或者我应该在乘法之前将
\u seed
和乘法器
转换为浮点数,以便允许更大的变量?LCG是用整数算术实现的,因为浮点算术只是近似的-浮点实现将与整数实现不同,并且不会产生完全的结果发电机的循环。即使是双精度整数也只有52个尾数位,这比以保证精度存储两个32位整数的乘积所需的尾数少。在模运算中,低位是有意义的,它们有被删除的风险
解决方案:
“即使是双精度也只有52位”<但是,您只能将31位整数与
48271
相乘。这是否足以容纳一个52位的双精度/数字而不丢失准确性?对于这个特定的LCG,是的,但如果您愿意使用双精度,为什么不使用长的?唉,AS3和Haxe(我的目标语言)都不支持这种数据类型。它们分别限制为32位和31位整数,以及精度为52位的浮点数据类型。JavaScript似乎只支持后者。如果你查阅Schrage的论文,它说明了如何分解乘法,使中间结果不超过31位。它是用FORTRAN编写的,所以需要翻译成AS3/Haxe,但它非常简单。30年前,我将它迁移到C没有问题。