This implementation always moves the nth item, it should only do it most of the time, it could never return the starting array but needs to be able to.
i = Math.random() * n-- | 0;
generates a value less than n.And
t = array[n];
array[n] = array[i];
array[i] = t;
is using a decremented n.You are being confused by the `n--` in the random selection.