Perlin noise and simplex noise are designed to create usable noise, not completely random noise. These algorithms are usually used to create landscape-processed landscapes, etc. For example, it can generate terrain such as this (image here ):

In this image, noise generates a 2D elevation map such as this (image from here ):

Each pixel color represents a height. After creating a height map, rendering is used to create a landscape corresponding to the "heights" (colors) of the image.
Therefore, the results of the algorithm are not really “random”; There are many easily distinguishable patterns, as you can see.
The simplex supposedly looks a little “better," which implies less randomness, but its main purpose is that it produces similar noise, but scales to higher dimensions. That is, if you were to produce 3D, 4D, 5D noise, simplex noise would exceed Perlin noise and get similar results.
If you want a pseudo random number generator generator, check out Mersenne twister or other prngs . Be careful cryptography, prngs may be full of reservations.
Update:
(answer to an updated OPs question)
Regarding the random properties of these noise functions, I know that perlin noise uses a (very) bad person as input and does some smoothing / interpolation between adjacent “random” pixels. Random randomness is actually just pseudo-random indexing into a precomputed random vector.
An index is calculated using some simple integer operations, nothing unusual. For example, the noise ++ project uses the precomputed "randomVectors" (see here ) to get the original noise and interpolate between different values from this vector. It generates a “random” index into this vector with some simple integer operations, adding a small amount of pseudo-randomness. Here is a snippet:
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)]; ...
Some random noise is then smoothed out and actually mixed with neighboring pixels, producing patterns.
After creating the initial noise, perlin / simplex noise has the concept of octave noise; that is, shifting the noise onto itself at different scales. This gives even more patterns. Thus, the initial noise quality is probably as good as before the calculated random arrays, plus the effect of pseudoscientific indexing. But after all that perlin noise does to it, the apparent randomness is greatly reduced (it really spreads over a wider area, I think).