In-place O(n), known as Fisher–Yates algorithm
function shuffle(arr) {
var m = arr.length, t, i;
while (m) {
i = Math.floor(Math.random() * m--);
t = arr[m];
arr[m] = arr[i];
arr[i] = t;
}
return arr;
}
python implementation
from random import randrange
def shuffle(items):
i = len(items)
while i > 1:
i = i - 1
j = randrange(i) # 0 <= j <= i-1
items[j], items[i] = items[i], items[j]
return