Fisher–Yates shuffle(以Ronald Fisher和Frank Yates的名字命名的) 最早在1938年Ronald Fisher和Frank Yates的书tatistical tables for biological, agricultural and medical research里被描述,他们是这样描述这个算法的(其实是我自己理解翻译的,毕竟1938年哪有什么数组啊):
到了1964年,这个算法的现代版本被Richard Durstenfeld提出,随着Donald E. Knuth的(The Art of Computer Programming)[http://]被推广 Durstenfeld和Knuth在Fisher和Yates的基础上改进了这个算法 时间复杂度从O(n2)降低到了O(n);
来看看伪代码描述
-- To shuffle an array a of n elements (indices 0..n-1):fori from n−1 downto 1do
j ← random integer such that 0 ≤ j ≤ i// 生成一个从0到i的随机数exchangea[j] anda[i] // 交换j和i的值
To initialize an array a of n elements to a randomly shuffled copy of source, both 0-based:
fori from 0 to n − 1do
j ← random integer such that 0 ≤ j ≤ iif j ≠ ia[i] ← a[j]
a[j] ← source[i]
js实现:
functionshuffle(arr){
var len = arr.len,
shuffledArr = Array(len);
for(var i = 0, rand; i < len; i++) {
rand = randomRange(i);
if(rand !== i) shuffledArr[i] = shuffledArr[rand];
shuffledArr[rand] = arr[i];
}returnshuffledArr;
}