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位整数的乘积所需的尾数少。在模运算中,低位是有意义的,它们有被删除的风险

解决方案:

  • 您应该使用64位整数执行中间算术,然后 模运算后,将结果转换回32位整数

  • 将乘法显式分解为低位/高位 组件,然后在模运算后重新组合它们。 这就是Schrage为实现相对流行(当时)的LCG所做的


  • “即使是双精度也只有52位”<但是,您只能将31位整数与
    48271
    相乘。这是否足以容纳一个52位的双精度/数字而不丢失准确性?对于这个特定的LCG,是的,但如果您愿意使用双精度,为什么不使用长的?唉,AS3和Haxe(我的目标语言)都不支持这种数据类型。它们分别限制为32位和31位整数,以及精度为52位的浮点数据类型。JavaScript似乎只支持后者。如果你查阅Schrage的论文,它说明了如何分解乘法,使中间结果不超过31位。它是用FORTRAN编写的,所以需要翻译成AS3/Haxe,但它非常简单。30年前,我将它迁移到C没有问题。