陣列洗牌演算法-shuffle

看風景就發表於2017-12-09

陣列洗牌,最近直接的想法是從陣列隨機取出一個元素,放到另一個陣列中,但是這樣取出的元素會有重複,必須採取一定的方法保證:

1. 元素不能重複
2. 元素被抽取的概率相等,即隨機性

陣列洗牌經典演算法有兩種:

1. Fisher-Yates Shuffle(複雜度(n^2))

陣列的刪除以及新的copy陣列都是耗費時間和空間的。

javascript實現

function FyShuffle(arr){
    var copy = [],
        len = arr.length,
        n;
    while(len)
        n = Math.floor(Math.random() * len--);
        res.push(arr.splice(n,1)[0]);
    }
    return copy;
}

2. Knuth-Durstenfeld Shuffle(複雜度(n),是Fisher-Yates演算法的改進版本)

kd方法是一種in-place的置換方法,節省空間,效能也好,隨機性好,python內建的random.shuffle用了此演算法。

javascript實現

function KdShuffle(arr){
    var len = arr.length,
        i,temp;
    while(len){
        i = Math.floor(Math.random() * len--);
        temp = arr[i];
        arr[i] = arr[len];
        arr[len] = temp;
    }
    return arr;
}

 

 

參考:http://www.cnblogs.com/Wayou/p/fisher_yates_shuffle.html
   http://www.cnblogs.com/tudas/p/3-shuffle-algorithm.html

相關文章