This is just a simplistic description of Perlin Noise. However while implementing the algorithm this is not the way to go. Because it's very very slow -- the author has simply taken non-coherent noise and smoothened it and this is computationally very expensive.
And also Ken Perlin has made an improved version to his original with some speedups and a reference implementation in Java can be found here: http://mrl.nyu.edu/~perlin/noise/
"... I first started to think seriously about procedural textures when I was working on TRON at MAGI in Elmsford, NY, in 1981. ..." ~ http://www.noisemachine.com/talk1/4.html
According to https://secure.wikimedia.org/wikipedia/en/wiki/Value_noise (which cites this), this page actually describes value noise, not Perlin. I emailed the author, who told me he no longer has access to the site, so unfortunately, people will be fooled for years to come.
They are generated randomly. Ken Perlin has described it in his book Texturing, Modeling A Procedural Approach. If I remember correctly the numbers have to be such that every direction should have an equal chance. Even distribution I think.
I wrote a Python extension based on the original Ken Perlin's algorithm. Just found it on my hard drive and uploaded it to github: http://github.com/ii/perlin
Wow, 2 Ken Perlin related posts in an hour! I met Ken Perlin once very briefly and randomly and was a bit in shock when I realized who I was talking to. He was in shock that I was in shock. Nice (and very smart) guy.
A never-released (3d space mmorpg wing-commander-esque) game my friends worked on for a while used this for texturing their worlds: http://www.cocommand.com/
And also Ken Perlin has made an improved version to his original with some speedups and a reference implementation in Java can be found here: http://mrl.nyu.edu/~perlin/noise/