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);
}

ただし、C ++の代わりにluaを使用しているため、二項演算子は使用できません。私は多くの異なることを試しましたが、どれもうまくいきません。ヘルプ?

4

4 に答える 4

3

ビット演算子(「バイナリ」の意味だと思います)については、LuaBitOpbitlibなどの使用できるモジュールのリストが含まれているビット演算子のWikiページを参照してください。

自分で実装したくない場合は、Perlinノイズの実装を含むモジュールlua-noiseを見てください。これは進行中のCモジュールであることに注意してください。

于 2011-07-14T14:31:48.773 に答える
1

私が間違っていなければ、パーリンノイズに関するMatt ZuckerのFAQは、算術演算子のみを使用してそれを記述/実装しています。最適化のトリックとしてビット演算子についてのみ言及しています。

速度の違いを理解するには、両方の方法を実装し、同じ言語/ランタイムでテストする必要があります。

于 2011-07-26T10:18:24.920 に答える
1

上記のルーチンには、算術演算に簡単に変換できないビット単位の演算子はありません。

<< 13 は * 8192 になります

& 0x7FFFFFFF は 2^31 の mod になります。

オーバーフローが問題にならない限り、これで十分です。

于 2011-07-26T20:37:44.277 に答える
0

It'd be pretty slow, but you could simulate these with division and multiplication, I believe.

于 2011-07-23T22:24:10.840 に答える