Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

So sánh shuffle và random_shuffle trong C++

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ự.