随机洗牌算法:
时间和空间复杂度都为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。
时间: 2024-10-08 01:47:06