Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL을 활용한 배열 무작위 섞기: random_shuffle()과 shuffle() 완벽 정리

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() 함수를 사용하는 것이 좋습니다.