洗牌算法Fisher_Yates原理


1.算法

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

簡單的原理如下圖所示:

 

2.原理

總結下,洗牌算法Fisher_Yates的原理就是把從1到n的順序候選集隨機打亂,

做法就是

第1次從1-n的候選集合隨機選個數,拿出此數,並把它從候選集合剔除(候選集合n-1)。

第2次從1-n-1的候選集合隨機選個數,拿出此數,並把它從候選集合剔除(候選集合n-2)。

第2次從1-n-2的候選集合隨機選個數,拿出此數,並把它從候選集合剔除(候選集合n-3)。

以此類推。

 

3.理論保證

個人理解,如有錯誤請大家糾正:

a,b,c

第1次取出a的概率 1/3

第2次取出a的概率 2/3(取出b概率+取出c概率) * 1/2 (剩下2個中取出a的概率) = 1/3

第3次取出a的概率 2/3 * 1/2 * 1/1 = 1/3

以此類推可以算出b和c,得到如下表格:

 

字符/出現位置概率 1 2 3
a 1/3 1/3 1/3
b   1/3 1/3 1/3
c 1/3 1/3 1/3

  

4.實際應用

有個時間復雜度是O(n)的實現,如下:

void ShuffleArray_Fisher_Yates(char* arr, int len)
{
    int i = len, j;
    char temp;
 
    if ( i == 0 ) return;
    while ( --i ) {
        j = rand() % (i+1);
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

 


免責聲明!

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



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