C++에서 배열이나 벡터의 요소 순서를 무작위로 섞어야 할 때가 종종 있습니다. 이럴 때 STL(표준 템플릿 라이브러리)에서 제공하는 random_shuffle()과 shuffle() 함수를 활용하면 간단하게 해결할 수 있습니다. 배열 대신 vector를 사용해도 사용 방법은 동일합니다.
random_shuffle() 함수란?
random_shuffle()은 지정된 범위 [first, last) 내의 요소들을 무작위로 재배치하는 함수입니다. 각 요소의 위치를 임의로 선택된 다른 위치와 서로 교환하는 방식으로 동작합니다.
이 함수에는 사용자가 직접 정의한 난수 생성 함수를 전달할 수도 있습니다. 난수 생성기를 별도로 지정하지 않으면, 함수 내부에 내장된 기본 난수 생성기가 자동으로 사용됩니다.
random_shuffle() 사용 예제
#include <bits/stdc++.h>
using namespace std;
int myRandomGenerator(int j) {
return rand() % j;
}
int main() {
srand(unsigned(time(0)));
vector<int> arr;
// 1부터 19까지의 숫자를 생성하여 벡터 arr에 추가
for (int j = 1; j < 20; ++j)
arr.push_back(j);
// 내장 난수 생성기를 사용하여 셔플
random_shuffle(arr.begin(), arr.end());
cout << "arr elements:";
for (vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
cout << ' ' << *i;
cout << endl;
// 사용자 정의 난수 생성기(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;
}실행 결과
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
shuffle() 함수란?
shuffle() 역시 지정된 범위 [first, last) 내의 요소들을 무작위로 재배치하는 함수입니다. 다만 이 함수는 균일 분포(uniform) 난수 생성기를 인수로 반드시 받아야 한다는 점이 특징입니다.
shuffle() 사용 예제
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> arr;
unsigned seed = 0;
// 1부터 19까지의 숫자를 생성하여 벡터 arr에 추가
for (int j = 1; j < 20; ++j)
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;
}실행 결과
arr elements: 19 7 5 6 12 4 13 3 1 17 11 14 18 2 8 15 9 10 16
random_shuffle()과 shuffle()의 차이점
두 함수의 가장 큰 차이는 난수 생성 방식에 있습니다. random_shuffle()은 C 표준 라이브러리의 rand() 함수를 기반으로 무작위 인덱스를 생성하는 반면, shuffle()은 C++11부터 도입된 <random> 헤더의 균일 난수 생성기(uniform random number generator)를 사용합니다.
참고로 random_shuffle()에 균일 난수 생성기를 전달하면 일종의 결과를 얻을 수 있지만, 권장되는 방식은 아닙니다.
또한 중요한 점은 random_shuffle()이 C++14에서 폐기(deprecated)되었고, C++17부터는 표준에서 완전히 제거되었다는 사실입니다. 따라서 최신 C++ 코드를 작성할 때는 예측 가능성과 이식성이 더 뛰어난 shuffle() 함수를 사용하는 것이 좋습니다.