是否存在仅返回正值的线性同余生成器算法?

时间:2013-12-26 23:26:20

标签: algorithm integer prng

我知道一个; ZX频谱apparently使用模数为65537的Lehmer RNG和乘数75.这仅生成大于零的数字。但是,我想使用周期超过2 ^ 16 - 1的东西。

我在一个32位字长的语言中用于整数(Haxe),所以理想情况下它会小于2 ^ 31。但是,我不一定要寻找特定于Haxe的答案。

2 个答案:

答案 0 :(得分:2)

在使用二进制补码的机器中(这意味着x86和衍生物,以及几乎任何其他可能遇到的计算机),高位用于指示符号。如果设置了高位,则该数字为负。

因此,您可以通过清除高位确保数字为正数。在32位数字的情况下,这是一个简单的问题:

result = result & 0x7FFFFFFF;

答案 1 :(得分:0)

好的,这应该是显而易见的,但我明白了。这是我的等式:

internalSeed = ( internalSeed * MULTIPLIER + INCREMENT ) % MODULUS + MODULUS;

为了防止超出整数的字长,同时仍然提供大量的返回,我使用了Microsoft Visual Basic 6伪随机值:

MULTIPLIER = 1140671485
INCREMENT = 12820163
MODULUS = 16777216

然后+ MODULUS值当然会改变范围从(-16777216,16777216)到(0,34554429),这就是我想要的。

编辑:上面的一些评论提供了不同的解决方案。

代替Math.abs(),可以始终对if ( result < 0 )进行简单检查,然后将结果乘以-1(如果为真)。我不确定这会对速度产生多大影响,但我认为这不会太多。

最复杂的答案是你在0x7FFFFFFF的结果上运行按位AND以修剪负位。这对速度没有影响,确实确保了正值。