I think that’s an artifact with how the perlin noise is calculated. It’s kind of hard to google info about it. According to the description of the algorithm on Wikipedia I can see a part of the calculation which will make the result tend more to a midrange value. If you implemented the algorithm with events you could correct that but I’m not sure if it would affect the look of the noise in an adverse way.
From what I read, traditional perlin noise causes most values to be in the -0.7 to 0.7 range. But if you change that to the 0-1 range you get values like you’re testing.
One thing you can do is scale the noise to be closer to the 0-1 range. Something like this:
((Noise(x,y)*2-1)/0.75)/2+0.5
It converts it to the -1 to 1 range, scales it by 0.75 then converts it back to the 0 to 1 range.
The 0.75 comes from your max value of 0.85. (0.85-0.5)*2=0.7 but I just used a slightly higher value.
There’s also different way you can scale it. Using an exponent you can push values from the center.
Value= Noise(x,y)*2-1
Value= sign(value)*abs(value)^0.3
Value= value/2+0.5
The 0.3 is a bit arbitrary. But no matter the value you won’t get a result out of the 0 to 1 range.
The way you calculate the min/max works too. You just don’t have to do that every time your games runs. The values you get will hover around the same thing for each noise type. So you can find those once outside your game and just use those values to normalize your game. You can then clamp that too if you have outliers.
Clamp((Noise(x,y)-minValue)/(maxValue-minValue), 0, 1)
You asked about simplex noise but I imagine that has the same quality as perlin. You could also do smoothed noise and get a perfect 0-1 range, it just looks more grid like.