Another technique I have used to create terrain procedurally is faulting. Faulting to create terrain is essentially just cutting a flat plane in half in a random direction, then raising one half and lowering the other half. This process is iterated until reasonably realistic terrain is created.
Here is an example I created using faulting:
Faulting is fast and efficient but to create realistic terrain over a large scale it will probably take thousands of iterations. However, if you were to create a game like Minecraft or something similar where the terrain does not need to be high resolution, faulting would be ideal.