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):

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

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).