There are many ways to do procedural generation, and the method depends on the effect you are trying to accomplish.
From Wikipedia: en.wikipedia.org/wiki/Fractal_landscape
eneration of fractal landscapes
A way to make such a landscape is to employ the random midpoint displacement algorithm, in which a square is subdivided into four smaller equal squares and the center point is vertically offset by some random amount. The process is repeated on the four new squares, and so on, until the desired level of detail is reached. There are many fractal procedures (such as Perlin noise) capable of creating terrain data, however, the term "fractal landscape" has become more generic.
Procedural generation is basically random generation, with a consistent set of limitations on each generated chunk. Write a function to create the effect you are looking for, and call it every time you need a new chunk.