What I would do is to do something they do in the movie industry to create textures. It's called Perlin Noise. Google it. It's used to give very natural looking paths and surfaces, like mountains, clouds, water, stucco, wood, etc. Much more natural looking paths than the harsh, erratic paths you'd get simply by calling rand() and adding that noise to your signals.
Basically the way Perlin noise works is you take a very few locations (say 5) on your path (you can start with any existing path or even just a line along the x axis if you want) and add some noise to those few locations. Then you interpolate the other y to go through those locations. This gives you the large scale noise/deviations. Now you take another set of more locations, say 10. Then you add noise to those locations but the noise has lower amplitude than the prior iteration. Then interpolate again. Then just iterate a bunch of times decreasing the spacing between the noise points and decreasing their amplitude. So with each iteration you are adding finer and finer noise (smaller and more detailed). I wrote a demo for you that I think does that and I've attached the demo, perlin_noise.m. I also pin down the end points so that you start and end at the same locations, which is what you said you need. It produces plots such as the one below:
What you could do is use this to create 3 signals: one for x, one for y, and one for z. This will give a smoother, more natural path than if you just simply used rand() to add noise to your signals.
Adapt the code as needed, like build into a function, get rid of fancy plots, or whatever you need.