我知道一个; ZX频谱apparently使用模数为65537的Lehmer RNG和乘数75.这仅生成大于零的数字。但是,我想使用周期超过2 ^ 16 - 1的东西。
我在一个32位字长的语言中用于整数(Haxe),所以理想情况下它会小于2 ^ 31。但是,我不一定要寻找特定于Haxe的答案。
答案 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以修剪负位。这对速度没有影响,确实确保了正值。