不使用二进制运算符来创建噪声函数?

有没有可能不使用任何二进制运算符来生成伪随机数?由于这是一个三维地图,我正试图将其作为X和Y的函数,但希望在其中包含一个randomseed,这样每次生成的地图就不会完全相同。我知道可以使用二进制运算符制作这样的噪声函数:

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 ++,我不能使用任何二进制运算符。我尝试了很多不同的事情,但它们没有任何用。请帮帮我?

原文链接 https://stackoverflow.com/questions/6687856

点赞
stackoverflow用户221509
stackoverflow用户221509

对于位运算符(我猜你指的是“二进制”),可以查看 位运算符 Wiki 页面,其中包含了一些可以使用的模块,如 Lua BitOpbitlib

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

2011-07-14 14:31:48
stackoverflow用户431350
stackoverflow用户431350

这可能会非常慢,但是我相信你可以通过除法和乘法模拟这些。

2011-07-23 22:24:10
stackoverflow用户400277
stackoverflow用户400277

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

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

(原文格式已保留)

2011-07-26 10:18:24
stackoverflow用户527574
stackoverflow用户527574

在上述例程中,没有任何不能轻松转换为算术运算符的位运算符。

<< 13 变成了 * 8192

& 0x7FFFFFFF 变成了 2^31 取模。

只要不会有溢出的问题,那么这应该就是你所需要的。

2011-07-26 20:37:44