Fun fact: since Perlin noise basically provides a smoothly varying scalar gradient over a space, it's trivial to extend it to higher dimensions (including variance through time), and to use it to generate things like vector fields when you need smooth but random motion or other effects.
Also fun to toy with different interpolation and noise generation algorithms.
It's a wonderfully simple idea and great fun to play around with!