【问题标题】:Making a noise function without binary operators?在没有二元运算符的情况下制作噪声函数?
【发布时间】:2011-10-04 23:54:33
【问题描述】:

有没有任何可能的方法可以在没有任何二元运算符的情况下生成伪随机数?由于这是一张 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++,所以我不能使用任何二元运算符。我尝试了许多不同的东西,但没有一个有效。 帮助?

【问题讨论】:

  • 当然。请改用三元运算符。但是,如果将其限制为一元... $x_{n+1} = \sin(\exp(x_n))$ 可能会产生良好的结果。
  • 抱歉,我现在才进入代数 2。xn+1 是什么意思/做什么?
  • 基本上我的意思是 $n^\hbox{th}$ 伪随机数是 $\sin(\exp(\hbox{ }n - 1\hbox{th 伪随机数}))$。注意$\exp(x)=e^x$。另一个好的方法是将 $n^\hbox{th}$ 伪随机数设为 $sin(exp(n))$。
  • 等等...二进制是指接受 2 个值还是指异或和二进制移位之类的东西?
  • 我的意思是我正在使用 lua,所以我手头没有任何二进制运算符。我也在谈论 sub n+1。比它低哪里?

标签: random lua noise


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      & 0x7FFFFFFF 成为 2^31 的模。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-05
          • 2020-09-16
          • 1970-01-01
          相关资源
          最近更新 更多