본문 바로가기
C++/STL

C++ vector 를 랜덤으로 섞는 방법, random_shuffle 사용방법

by Warehaus 2022. 7. 31.

 

안녕하세요 warehouse입니다.

 

 

오늘은 C++ 에서 생성 한 vector 를 마구잡이로 섞는 함수 

 

random_shuffle 에 대해서 알아보려고 합니다.

 

프로그래밍을 하다보면 vector에 값을 넣는 순서대로 데이터가 저장되어

저장 된 값을 사용할 때 편향성을 갖는 경우가 있습니다.

 

벡터에 데이터를 쌓아둔 상태에서 사용하고 다시 집어넣는 알고리즘이 있다고 하면,

가장 앞 또는 뒤에있는 데이터가 우선적으로 빠지고, 다시 넣게 될 것입니다.

 

특별한 구현을 하지 않는다면, 다음 동작에서도 동일하게 동작하겠죠

 

그런데 여기서 random_shuffle 함수를 이용하면

매 동작마다 꺼내지는 데이터를 섞어 줄 수 있습니다.

 

이제 코드 예시를 통해  어떻게 동작하는지 봅니다.

 

테스트 코드

 

우선 벡터를 하나 만들어 줍니다.

그리고 숫자를 넣어볼게요

 

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    std::vector<int> mybox;
    
    for (int i = 0; i < 10; i++ )
        mybox.push_back( i );

    for (int i = 0; i < 10; i++ )
    {
        cout<< i << " ";
    }
    cout<<endl;

    return 0;
}

 

빌드 후 실행을 해 봅니다.

출력은 다음과 같습니다.

 

$ ./a.out 
0 1 2 3 4 5 6 7 8 9

 

이제 random_shuffle 을 이용해 숫자를 섞어보겠습니다.

random_shuffle 은 iterator를 사용합니다.

begin, end 를 이용해 정렬 될 영역을 인자로 넣어줍니다.

 

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    std::vector<int> mybox;
    
    for (int i = 0; i < 10; i++ )
        mybox.push_back( i );

    for (int i = 0; i < 10; i++ )
    {
        cout<< mybox[i] << " ";
    }
    cout<<endl;

    random_shuffle(mybox.begin(), mybox.end());
    
    for (int i = 0; i < 10; i++ )
        cout<< mybox[i] << " ";
    cout<<endl;

    return 0;
}

 

빌드 후 출력을 확인하면 다음과 같습니다.

 

$ ./a.out 
0 1 2 3 4 5 6 7 8 9 
6 0 3 5 7 8 4 1 2 9

 

0 ~ 9 까지 입력 된 vector가 랜덤하게 섞인 결과를 볼 수 있습니다.