在没有二元运算符的情况下产生噪声

时间:2011-07-13 21:14:31

标签: random lua noise

有没有可能的方法来制作没有任何二元运算符的伪随机数?由于这是一张3D地图,我试图将它作为X和Y的函数,但希望在它们的某个地方包含一个随机种子,所以每次都不一样。我知道你可以使用二元运算符制作这样的噪声函数:

double PerlinNoise::Noise(int x, int y) const
{
    int n = x + y * 57;
    n = (n << 13) ^ n;
    int t = (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff;
    return 1.0 - double(t) * 0.931322574615478515625e-9;/// 1073741824.0);
}

但由于我使用lua而不是C ++,我不能使用任何二元运算符。我尝试了很多不同的东西,但没有一个能奏效。的 帮助?

4 个答案:

答案 0 :(得分:3)

对于位运算符(我猜你的意思是“二进制”),看一下Bitwise Operators Wiki page,其中包含可以使用的模块列表,如Lua BitOp和{{3 }}

如果您不想自己实现它,请查看模块bitlib,其中包含Perlin噪声的实现。请注意,它是一个正在进行中的C模块。

答案 1 :(得分:1)

如果我没弄错的话,Matt Zucker的FAQ on Perlin noise只使用算术运算符来描述/实现它。它只提到按位运算符作为优化技巧。

您应该实现这两种方式并使用相同的语言/运行时测试它们,以了解速度差异。

答案 2 :(得分:1)

在上面的例程中,没有任何按位运算符不容易转换为算术运算。

&lt;&lt; 13成为* 8192

&amp; 0x7FFFFFFF变为2 ^ 31的mod。

只要溢出不是问题,这应该就是您所需要的。

答案 3 :(得分:0)

它很慢,但你可以通过除法和乘法来模拟这些,我相信。