Functional programs handle state very well, but require a different way of looking at it. For your position example, one thing to consider is having your position be a function of time instead of a fixed value. This works well for particles following a fixed mathematical path, but you require a different strategy for handling a change in the path, such as after a collision.
The basic strategy here is you create functions that take in a state and return the new state. So a particle simulator would be a function that takes a Set
of particles as input and returns a new Set
of particles after a time step. Then you just repeatedly call that function with its input set to its previous result.