If you are using a matrix you can store information about each matrix tile. i.e. road_type(x,z)=1. Then using the information, you can write a function to control decision making of the ai cars when they are on a tile.
If not using a matrix, or if you don't want to write ai, you can make a simple program where you load in a level, then create a loop around the city. Then when you need to, position cars on that loop somewhere near to the camera and let them follow the path. By making a very long path that retraces hunctions etc. you can make it appear as though the cars are branching off at junctions.
I use the first method in my 'random city' programs because it is much simpler once you have thouight about a way of handling it.
As for keeping cars close range, just reposition them closer when they're too far. You should use the 'getdistance' function for this.
coincidence? how about pure cosmic convergence!