洗牌算法-shuffle


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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM