随机洗牌算法:
时间和空间复杂度都为O(n)。
1 #include2 3 using namespace std; 4 5 const int maxn = 54; 6 7 void random_shuffle(vector &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 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。