JS的一种洗牌算法

function shuffle (arr) {
    var i, j,temp;
    for(i=arr.length-1; i>0; i--) {
        j = Math.floor(Math.random()* (i+1))
        temp = arr[i]
        arr[i] = arr[j]
        arr[j] = temp
    }
    return arr
}

var arr = [1,2,3,4,5,6,7,8,9,10]

for(var i=0;i<20;i++) {
    console.log(shuffle(arr))
}

输出结果如下:

[ 3, 10, 9, 5, 6, 1, 8, 2, 4, 7 ]
[ 10, 5, 1, 2, 3, 9, 8, 7, 4, 6 ]
[ 8, 2, 1, 7, 10, 4, 3, 9, 5, 6 ]
[ 8, 3, 1, 9, 2, 7, 6, 5, 10, 4 ]
[ 10, 1, 5, 3, 8, 9, 2, 4, 7, 6 ]
[ 3, 1, 2, 5, 4, 7, 8, 10, 6, 9 ]
[ 2, 1, 10, 7, 9, 8, 4, 6, 5, 3 ]

原理:我们每一次循环从0-i(不包括i)中随机一个位置,将这个位置的元素与i位置的元素进行交换。循环结束,排序完成。

这种方法是经典的洗牌算法,更多方法见这里
Js数组随机排序

mode_edit