Every single duck calls the duckMove() function every frame. However, the duckMove function goes through the entire duck list and moves every single duck including itself. This means that if you have N ducks, each duck gets moved N times in a single logic tick instead of moving just once.
You should either remove the for loop from the function and have each duck just move itself or create a separate duck manager that moves all the ducks at once.
Your problem is that you’re running an instance of randpos.duckMove on each duck in the scene.
That means that the duck’s script should only be dealing with that particular duck’s behaviour. Instead, you have each duck applying behaviour to every duck. So for each duck that’s present in the screen, every duck gets the movement applied multiple times.
Rather than have the randpos.duckMove controller on the duck, place it on the camera. The camera will run the script once per frame, loop through each duck, give them their instructions, and that is that.
(Haha…took too much time trying to figure out how to word this. Sort of one of those things that much harder to explain than it really should be)