6

パーリン ノイズ アルゴリズムとシンプレックス ノイズ アルゴリズムのランダム性の品質は?

2 つのアルゴリズムのどちらがランダム性に優れていますか?

標準の疑似乱数ジェネレーターと比較して、乱数ジェネレーターとして Perlin/Simplex を使用することは理にかなっていますか?

更新: パーリン/シンプレックス ノイズの用途はわかっています。私はランダム性のプロパティにのみ興味があります。

4

4 に答える 4

5

パーリン ノイズとシンプレックス ノイズは、完全にランダムではなく、有用なノイズを生成するためのものです。これらのアルゴリズムは、通常、手続き的に生成されたランドスケープなどを作成するために使用されます。たとえば、次のような地形を生成できます (ここからの画像)。

パーリン ノイズから生成された地形

この画像では、ノイズによって次のような 2D 高さマップが生成されます (画像はこちらから):

パーリン ノイズによって生成された高さマップ

各ピクセルの色は高さを表します。ハイトマップを生成した後、レンダラーを使用して、画像の「高さ」(色) に一致する地形を作成します。

したがって、アルゴリズムの結果は実際には「ランダム」ではありません。ご覧のとおり、簡単に識別できるパターンがたくさんあります。

シンプレックスは少し「見栄えがよく」、ランダム性が低いことを意味すると思われますが、その主な目的は、同様のノイズを生成しますが、より高い次元にうまくスケーリングすることです。つまり、3D、4D、5D ノイズを生成する場合、シンプレックス ノイズはパーリン ノイズよりも優れており、同様の結果が生成されます。

一般的な疑似乱数ジェネレーターが必要な場合は、Mersenne twisterまたは他の prngsを参照してください。暗号化に関しては、prngs には警告がいっぱいになる可能性があることに注意してください。

アップデート:

(OPの更新された質問への回答)

これらのノイズ関数のランダムな特性については、パーリン ノイズが (非常に) 貧乏人の prng を入力として使用し、隣接する「ランダムな」ピクセル間で平滑化/補間を行うことを知っています。入力のランダム性は、実際には、事前に計算されたランダム ベクトルへの疑似ランダム インデックス付けです。

インデックスは単純な整数演算を使用して計算されますが、それほど凝ったものではありません。たとえば、noise++ プロジェクトは、事前に計算された「randomVectors」(こちらを参照) を使用してソース ノイズを取得し、このベクトルから異なる値を補間します。いくつかの単純な整数演算を使用して、このベクトルに「ランダムな」インデックスを生成し、少量の疑似乱数を追加します。ここにスニペットがあります:

int vIndex = (NOISE_X_FACTOR * ix + NOISE_Y_FACTOR * iy + NOISE_Z_FACTOR * iz + NOISE_SEED_FACTOR * seed) & 0xffffffff;
vIndex ^= (vIndex >> NOISE_SHIFT);
vIndex &= 0xff;

const Real xGradient = randomVectors3D[(vIndex<<2)];

...

次に、ややランダムなノイズが平滑化され、実際には隣接するピクセルとブレンドされて、パターンが生成されます。

初期ノイズを生成した後、パーリン/シンプレックス ノイズにはノイズのオクターブの概念があります。つまり、ノイズを異なるスケールで再ブレンドします。これにより、さらに多くのパターンが生成されます。したがって、ノイズの初期品質は、おそらく、事前計算されたランダム配列と疑似ランダム インデックスの効果を加えたものと同じ程度です。しかし、パーリンノイズがそれに影響を与えた後、見かけのランダム性は大幅に減少します(実際には、より広い領域に広がっていると思います).

于 2012-09-19T17:31:10.070 に答える
3

AI Game Wisdom 2の「The Statistics of Random Numbers」で述べられているように、どちらが「より良い」ランダム性を生成するかは、それを何に使用するかによって異なります。一般に、PRNG の品質はテスト バッテリーによって比較されます。印刷の時点で、著者は、PRNG のランダム性をテストするための最もよく知られており、最も広く使用されているテスト バッテリーはENTとDiehard であることを示していますまた、乱数をテストする方法、統計的ランダム性テストがアドホックに見える理由に関する関連する質問も参照してください。

典型的な PRNG のテストの標準的な問題を超えて、PRNG としてのパーリン ノイズまたはシンプレックス ノイズのテストは、次の理由でより複雑になります。

  1. どちらも内部的に PRNG を必要とするため、出力のランダム性は基になる PRNG の影響を受けます。
  2. ほとんどの PRNG には、調整可能なパラメーターがありません。対照的に、パーリン ノイズは、増加し続ける周波数と減少し続ける振幅を持つ 1 つ以上のコヒーレント ノイズ関数 (オクターブ) の合計です。最終的なイメージは使用されるオクターブの数と性質に依存するため、ランダム性の品質はそれに応じて異なります。libnoise: Noise モジュールのパラメーターの変更
  3. 「4Dシンプレックスノイズの3Dセクションは3Dシンプレックスノイズとは異なる」として、シンプレックスノイズで使用される次元数を変えることについて、#2と同様の議論が成り立ちます。Stefan Gustavson のシンプレックス ノイズの謎が解き明かされました。
于 2012-12-03T01:49:31.817 に答える
3

あなたは混乱していると思います。

perlin と simplex は、他のソースから乱数を取得し、乱数を減らして自然の風景のように見せます (乱数だけでは自然の風景のようには見えません)。

したがって、それらは乱数のソースではありません。他の場所からの乱数を処理する方法です。

たとえそれらが情報源であったとしても、それらは良い情報源ではありません (数値は強く相関しています)。

于 2012-09-19T17:37:15.823 に答える