3

有没有任何可能的方法可以在没有任何二元运算符的情况下制作伪随机数?由于这是一张 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

4 回答 4

3

对于位运算符(我猜这就是您所说的“二进制”),请查看Bitwise Operators Wiki page,其中包含您可以使用的模块列表,例如Lua BitOpbitlib

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

于 2011-07-14T14:31:48.773 回答
1

In the above routine, there are not any bit-wise operators that aren't easily converted to arithmetic operations.

The << 13 becomes * 8192

The & 0x7FFFFFFF becomes a mod of 2^31.

As long as overflow isn't an issue, this should be all you need.

于 2011-07-26T20:37:44.277 回答
1

如果我没记错的话,Matt Zucker 的关于 Perlin 噪声的常见问题解答仅使用算术运算符来描述/实现它。它只提到按位运算符作为优化技巧。

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

于 2011-07-26T10:18:24.920 回答
0

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

于 2011-07-23T22:24:10.840 回答