標籤:

如何將一個有序的數組隨機排序?


Fisher–Yates,可以保證每一種排列等概率

注意每次隨機挑兩個項交換,重複 N 次的做法是不行的,會導致某些排列出現的概率增大


如何測試洗牌程序


random_shuffle


演算法課上學的,還有數學證明其正確性。


假設有數組Array,長度為N。

while(N&>0){
生成0到N-1之間的隨機數Random;
swap(Array[Random],Array[N-1];
N--;
}


洗牌,筆試面試常考。


Fisher-Yates演算法。簡單來說就是循環一遍數組,將當前數據與該數據之前的隨機一個數值交換。


洗牌演算法咯


產生隨機序列,把隨機序列當做數組的排序關鍵字排序。


swap(arr[0], arr[arr[0]%arr.length]);

時間複雜度為O(1),正兒八經的偽隨機


推薦閱讀:

從事C#開發兩年,25歲轉Cocos2d-x開發,會不會太晚?
C/C++ 中 bool 相比於 char 有什麼優勢?為什麼要設立 bool 類型?
二級C習題10.10為什麼選C?
有必要在寫 C++ 時避免隱式轉換嗎?
C++中如何載入100K+的常數數組?

TAG:CC |