Hacker News new | ask | show | jobs
by serichsen 3257 days ago
The Fisher-Yates shuffle has an off-by-one.
1 comments

How so? It seems correct to me.
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.
This implementation NEVER moves the nth item as that is past the end of the array.

   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.