2012-09-18 13 views
6

Qual è la qualità casuale dell'algoritmo Perlin Noise e dell'algoritmo Simplex Noise?Qual è la qualità casuale degli algoritmi Perlin/Simplex Noise?

Quale algoritmo dei due ha una casualità migliore?

Rispetto ai generatori pseudo casuali standard, ha senso utilizzare Perlin/Simplex come generatore di numeri casuali?

Aggiornamento: So per cosa viene utilizzato Perlin/Simplex Noise. Sono solo curioso delle proprietà di casualità.

risposta

3

Come indicato in "Le statistiche dei numeri casuali", AI Game Wisdom 2, chiedere quale produce "migliore" casualità dipende da cosa si sta usando. In generale, la qualità dei PRNG viene confrontata con le batterie di prova. Al momento della stampa, l'autore indica che le più note batterie di prova più usate per testare la casualità dei PRNG sono ENT & Diehard. Inoltre, vedere le domande correlate di how to test random numbers e why statistical randomness tests seem ad-hoc.

là delle questioni standard di prova PRNGs tipici, test Perlin Noise o Simplex rumorosità in PRNGs è più complicato perché:

  1. Sia internamente richiedono un PRNG, così la casualità della loro produzione è influenzata dal PRNG sottostante .
  2. La maggior parte dei PRNG ha parametri non regolabili. Al contrario, il rumore di Perlin è la sommatoria di una o più funzioni di rumore coerente (ottave) con frequenze sempre crescenti e ampiezze sempre più decrescenti. Poiché l'immagine finale dipende dal numero e dalla natura delle ottave utilizzate, la qualità della casualità varierà di conseguenza. libnoise: Modifying the Parameters of the Noise Module
  3. Un argomento simile al # 2 vale per la variazione del numero di dimensioni utilizzate nel disturbo Simplex come "una sezione 3D di rumore simplex 4D è diversa dal rumore simplex 3D". Stefan Gustavson's Simplex noise demystified.
5

Perlin noise e simplex noise sono pensati per generare rumore utile, non per essere completamente casuali. Questi algoritmi sono generalmente utilizzati per creare paesaggi generati proceduralmente e simili. Ad esempio, esso può generare terreno come questo (immagine da here):

Terrain generated from perlin noise

In questa immagine, il rumore genera un 2D heightmap come questa (immagine da here):

Heightmap generated by perlin noise

Il colore di ogni pixel rappresenta un'altezza. Dopo aver prodotto una heightmap, viene utilizzato un renderer per creare un terreno che corrisponda alle "altezze" (colori) dell'immagine.

Pertanto, i risultati dell'algoritmo non sono in realtà "casuali"; ci sono molti modelli facilmente distinguibili, come puoi vedere.

Simplex sembra apparentemente un po 'più "bello", il che implicherebbe meno casualità, ma il suo scopo principale è che produce rumore simile ma scala a dimensioni superiori meglio. Cioè, se si produrrebbe rumore 3D, 4D, 5D, il rumore simplex supererebbe il rumore di Perlin e produrrebbe risultati simili.

Se si desidera un generatore di numeri casuali generico, consultare Mersenne twister o other prngs. State attenti, alla crittografia, i prnc possono essere pieni di avvertimenti.

Aggiornamento:

(risposta alla PO domanda aggiornato)

Per quanto riguarda le proprietà casuali di queste funzioni di disturbo, lo so disturbo Perlin utilizza un (molto) PRNG poveri come input, e lo fa alcuni smoothing/interpolazione tra pixel "random" adiacenti. La casualità dell'input è in realtà solo un'indicizzazione pseudocasuale in un vettore casuale precalcolato.

L'indice viene calcolato utilizzando alcune semplici operazioni a numeri interi, niente di eccessivo. Ad esempio, il progetto noise ++ utilizza "randomVectors" precomputati (vedere here) per ottenere il suo rumore sorgente e interpola tra valori diversi da questo vettore. Genera un indice "casuale" in questo vettore con alcune semplici operazioni di interi, aggiungendo una piccola quantità di pseudocasuale. Ecco un frammento:

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

... 

Il rumore un po 'casuale viene poi lisciato e in effetti mescolato con pixel vicini, producendo i modelli.

Dopo aver prodotto il rumore iniziale, il rumore perlin/simplex ha il concetto di ottave di rumore; cioè, ribaltando il rumore in se stesso a diverse scale.Questo produce ancora più schemi. Quindi la qualità iniziale del rumore è probabilmente buona solo come gli array casuali precalcolati, più l'effetto dell'indicizzazione psuedorandom. Ma dopo tutto quello che il perlin noise fa, l'apparente casualità diminuisce in modo significativo (si sparge effettivamente su un'area più ampia, credo).

3

penso che tu sia confuso.

perlin e simplex prendono numeri casuali da un'altra fonte e li rendono meno in modo casuale in modo che assomiglino più a paesaggi naturali (i numeri casuali da soli non sembrano paesaggi naturali).

quindi non sono una fonte di numeri casuali - sono un modo di elaborare numeri casuali da qualche altra parte.

e anche se fossero una fonte, non sarebbero una buona fonte (i numeri sono fortemente correlati).

Problemi correlati