Chúng ta sẽ xem shuffle và random_shuffle trong C++. Xem random_shuffle trước. Hàm này dùng để sắp xếp ngẫu nhiên các phần tử trong phạm vi [left, right). Hàm hoán đổi ngẫu nhiên vị trí từng phần tử với vị trí được chọn ngẫu nhiên.
Ta có thể cung cấp hàm sinh số ngẫu nhiên để quyết định phần tử nào được chọn mỗi lần. Nếu không cung cấp, nó dùng hàm sinh ngẫu nhiên mặc định.
Ví dụ
#include <bits/stdc++.h>
using namespace std;
int myRandomGenerator(int j) {
return rand() % j;
}
int main() {
srand(unsigned(time(0)));
vector<int> arr;
for (int j = 1; j < 20; ++j) // sinh 20 số thêm vào vector
arr.push_back(j);
random_shuffle(arr.begin(), arr.end()); // dùng hàm ngẫu nhiên mặc định
cout << "arr elements:";
for (vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
cout << ' ' << *i;
cout << endl;
// dùng myRandomGenerator
random_shuffle(arr.begin(), arr.end(), myRandomGenerator);
cout << "arr elements:";
for (vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
cout << ' ' << *i;
cout << endl;
}
Kết quả
arr elements: 5 14 15 6 3 16 13 12 10 2 4 1 17 9 18 11 7 8 19 arr elements: 8 10 5 6 14 1 15 3 19 16 13 18 7 9 4 12 11 17 2
Bây giờ xem shuffle(). Hàm này cũng sắp xếp ngẫu nhiên các phần tử trong phạm vi [left, right). Nó nhận một bộ sinh số ngẫu nhiên đồng nhất (uniform random number generator).
Ví dụ
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> arr;
unsigned seed = 0;
for (int j = 1; j < 20; ++j) // sinh 20 số thêm vào vector
arr.push_back(j);
shuffle(arr.begin(), arr.end(), default_random_engine(seed));
cout << "arr elements:";
for (vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
cout << ' ' << *i;
cout << endl;
}
Kết quả
arr elements: 19 7 5 6 12 4 13 3 1 17 11 14 18 2 8 15 9 10 16
Khác biệt duy nhất giữa random_shuffle() và shuffle() là: random_shuffle() dùng rand() để sinh chỉ số ngẫu nhiên, shuffle() dùng bộ sinh số ngẫu nhiên đồng nhất. Tuy nhiên, nếu truyền bộ sinh đồng nhất cho random_shuffle(), kết quả sẽ tương tự.