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; } }
