随机洗牌算法

随机洗牌算法:

时间和空间复杂度都为O(n)。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int maxn = 54;
 6 
 7 void random_shuffle(vector<int> &a)
 8 {
 9     srand(int(time(0)));
10     int aSize = a.size();
11     for(int i = 1; i != aSize; ++i) {
12         int j = rand() % (i + 1);
13         if(i != j) swap(a[i], a[j]);    // 每次都和前面的某一个数进行交换
14     }
15 }
16 
17 int main() {
18     vector<int> a;
19     for(int i = 1; i <= maxn; i++) a.push_back(i);
20     random_shuffle(a);
21     for(int i = 0; i < maxn; i++) printf("%d ", a[i]);
22     puts("");
23     return 0;
24 }

 可以由概率算出,每个数(每张牌)在每个位置的概率都是1/maxn。

posted @ 2017-11-28 12:57  叶建成  阅读(345)  评论(0编辑  收藏  举报