2012-09-18 25 views
6

Wie ist die Zufälligkeit des Perlin Noise-Algorithmus und des Simplex Noise-Algorithmus?Wie ist die Zufälligkeit der Perlin/Simplex Noise-Algorithmen?

Welcher Algorithmus der beiden hat bessere Zufälligkeit?

Verglichen mit herkömmlichen Pseudozufallsgeneratoren macht es Sinn, Perlin/Simplex als Zufallsgenerator zu verwenden?

Update: Ich weiß, wofür das Perlin/Simplex Noise verwendet wird. Ich bin nur auf Zufälligkeitseigenschaften neugierig.

Antwort

3

Wie in "Die Statistik der Zufallszahlen", AI Game Wisdom 2, angegeben, hängt die Frage, welche "bessere" Zufälligkeit produziert, davon ab, wofür Sie es verwenden. Im Allgemeinen wird die Qualität von PRNGs über Testbatterien verglichen. Zum Zeitpunkt des Druckens gibt der Autor an, dass die bekanntesten & am häufigsten verwendeten Testbatterien zum Testen der Zufälligkeit von PRNGs ENT & Diehard sind. Siehe auch verwandte Fragen von how to test random numbers und why statistical randomness tests seem ad-hoc.

Neben den Standardfragen von typischen PRNGs testen, testen Perlin Noise oder Simplex Lärm als PRNGs komplizierter, weil:

  1. Sowohl intern benötigen einen PRNG, damit die Zufälligkeit ihrer Ausgabe durch die zugrunde liegenden PRNG beeinflusst wird .
  2. Die meisten PRNGs haben keine abstimmbaren Parameter. Im Gegensatz dazu ist das Perlin-Rauschen eine Summierung von einer oder mehreren kohärenten Rauschfunktionen (Oktaven) mit ständig ansteigenden Frequenzen und immer abnehmenden Amplituden. Da das endgültige Bild von der Anzahl und Art der verwendeten Oktaven abhängt, variiert die Qualität der Zufälligkeit entsprechend. libnoise: Modifying the Parameters of the Noise Module
  3. Ein Argument ähnlich wie # 2 gilt für die Variation der Anzahl von Dimensionen, die in Simplex-Rauschen verwendet werden, da "ein 3D-Abschnitt von 4D-Simplex-Rauschen sich von 3D-Simplex-Rauschen unterscheidet". Stefan Gustavsons Simplex noise demystified.
5

Perlin-Rauschen und Simplex-Rauschen sollen nützliches Rauschen erzeugen und nicht völlig zufällig sein. Diese Algorithmen werden im Allgemeinen verwendet, um prozedural erzeugte Landschaften und dergleichen zu erzeugen. Zum Beispiel ist es Gelände wie dieses (Bild von here) erzeugen kann:

Terrain generated from perlin noise

In diesem Bild, erzeugt das Rauschen eines 2D heightmap wie dies (Bild von here):

Heightmap generated by perlin noise

Die Farbe jedes Pixels entspricht einer Höhe. Nach dem Erstellen einer Heightmap wird mit einem Renderer ein Gelände erstellt, das den "Höhen" (Farben) des Bildes entspricht.

Daher sind die Ergebnisse des Algorithmus nicht wirklich "zufällig"; Es gibt viele leicht erkennbare Muster, wie Sie sehen können.

Simplex scheint angeblich ein bisschen "netter" zu sein, was weniger Zufälligkeit bedeuten würde, aber sein Hauptzweck ist, dass es ähnliche Geräusche erzeugt, aber besser zu höheren Dimensionen skaliert. Das heißt, wenn man 3D-, 4D-, 5D-Rauschen erzeugen würde, würde Simplex-Rauschen das Perlin-Rauschen übertreffen und ähnliche Ergebnisse erzeugen.

Wenn Sie einen allgemeinen Pseudozufallszahlengenerator wünschen, schauen Sie sich die Mersenne twister oder other prngs an. Seien Sie gewarnt, Kryptografie, prngs kann voller Vorbehalte sein.

Update:

(Antwort auf OPs aktualisiert Frage)

Was die zufälligen Eigenschaften dieser Störungsfunktionen, weiß ich Perlin Noise verwendet einen (sehr) des armen Mannes PRNG als Eingabe und tut etwas Glättung/Interpolation zwischen benachbarten "zufälligen" Pixeln. Die Zufälligkeit der Eingabe ist eigentlich nur Pseudozufallsindexierung in einen vorberechneten Zufallsvektor.

Der Index wird mit einigen einfachen ganzzahligen Operationen berechnet, nichts zu ausgefallen. Zum Beispiel verwendet das noise ++ - Projekt vorberechnete "randomVectors" (siehe here), um sein Quellrauschen zu erhalten, und interpoliert zwischen verschiedenen Werten von diesem Vektor. Es erzeugt einen "zufälligen" Index in diesen Vektor mit einigen einfachen ganzzahligen Operationen, die eine kleine Menge an Pseudozufälligkeit hinzufügen. Hier ist ein Ausschnitt:

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

... 

Das etwas zufällige Rauschen wird dann geglättet und in Wirkung mit benachbarten Pixeln gemischt werden, um die Muster zu erzeugen.

Nach dem Erzeugen des Anfangsgeräuschs hat Perlin/Simplex-Rauschen das Konzept von Oktaven von Rauschen; das heißt, das Rauschen in verschiedenen Maßstäben wieder in sich selbst zu mischen.Dies erzeugt noch mehr Muster. Daher ist die anfängliche Qualität des Rauschens wahrscheinlich nur so gut wie die vorberechneten Zufallsarrays plus der Effekt der Pseudozufallsindexierung. Aber nach allem, was das Perlin-Rauschen tut, nimmt die scheinbare Zufälligkeit signifikant ab (sie breitet sich tatsächlich über eine größere Fläche aus, denke ich).

3

ich denke, du bist verwirrt.

Perlin und Simplex nehmen Zufallszahlen aus einer anderen Quelle und machen sie weniger zufällig, so dass sie eher wie Naturlandschaften aussehen (Zufallszahlen allein sehen nicht wie natürliche Landschaften aus).

so sind sie keine Quelle von Zufallszahlen - sie sind eine Möglichkeit, Zufallszahlen von woanders zu verarbeiten.

und selbst wenn sie eine Quelle wären, wären sie keine gute Quelle (die Zahlen sind stark korreliert).