kyuseo의 게임 프로그래밍

숫자를 섞어서 중복 없이 산출하는 방법 (Shuffle Number) 본문

C++ 개발

숫자를 섞어서 중복 없이 산출하는 방법 (Shuffle Number)

kyuseo 2008. 11. 12. 11:12

개요..

 

숫자를 섞어서 중복 없이 산출하는 방법 (Shuffle Number)을 소개해드립니다.

 

주로 10개의 문제를 중복 없이 뒤섞어 문제 발행을 하거나, 학생을 무작위로 재배치 하는데 사용이 되는 코드입니다.

 

 

 

 

방법

 

소스코드:

        // 1 ~ 10 까지의숫자를중복없이뒤섞어순차적으로뽑아내는방법

        IntArray m_iaShuffleQ; ///< 섞여진문제

 

        // 숫자를입력한다.

        for( int i = 0; i < 10; i++ )

            m_iaShuffleQ.Add( i+1 );

 

        // 숫자를섞는다. (내부적으로swap 으로섞는다.)

        m_iaShuffleQ.Shuffle();

 

        // 순차적으로숫자를뽑아낸다.

        for( int i = 0; i < 10; i++ )

        {            

            TRACE( " %d ", m_iaShuffleQ[i] );

        }

 

 

출력결과:

9 7 2 10 3 4 1 5 8 6

5 2 1 4 8 10 9 7 3 6

9 8 10 3 5 2 6 4 7 1

6 5 7 4 10 1 9 8 3 2

2 1 5 4 9 7 8 3 10 6

6 9 1 5 7 8 2 4 3 10

6 5 4 9 3 10 1 7 8 2

8 3 6 9 1 7 2 10 5 4

6 3 9 7 5 10 4 8 2 1

3 6 10 1 8 2 9 5 7 4

1 2 3 10 7 6 8 9 4 5

1 5 3 8 4 2 6 9 10 7

6 2 7 8 5 4 10 1 9 3

10 1 2 6 9 8 7 5 4 3

 

 

 

참고 사항

 

위 코드에서 사용한 IntArray 템플릿 클래스 및 사용한 Shuffle 함수는 다음과 같습니다.

 

template< class TYPE, class ARG_TYPE >

class CPArray : public CArray< TYPE, ARG_TYPE >

{

public:

    using CArray2< TYPE, ARG_TYPE >::GetCount;

 

    INT_PTR GetCount( ARG_TYPE t, INT_PTR nStart = 0 ) const; ///< 주어진인자의총개수를구한다.

    INT_PTR Find( ARG_TYPE t, INT_PTR nStart = 0 ) const; ///< 주어진인자의첫번째것을찾는다.

    INT_PTR Delete( ARG_TYPE t, INT_PTR nStart = 0 ); ///< 주어진인자에해당하는것을지운다. (리턴:지워진개수)

 

    TYPE& GetHead();

    const TYPE& GetHead() const;

    TYPE& GetTail();

    const TYPE& GetTail() const;

 

    TYPE RemoveHead();

    TYPE RemoveTail();

 

    void Sort( BOOL bDesc = FALSE ); ///< 정렬한다. ( 해당TYPE >, <, == 가정의되어있어야한다. )

    void Sort( int ( __cdecl *Compare )( const void *pArg1, const void *pArg2 ) ); ///< 외부함수로정렬한다.

 

    void Shuffle( int nCount = 5 ); ///< 섞는다.

 

    // 자체메모리할당된포인터전용함수

    void DeleteRemovtAt( INT_PTR nIndex, INT_PTR nCount = 1 ); ///< delete 하고RemoveAt 한다.

    void DeleteRemoveAll(); ///< delete 하고RemoveAll 한다.

 

protected:

    static int CompareAsc( const void *pArg1, const void *pArg2 );

    static int CompareDesc( const void *pArg1, const void *pArg2 );

};

 

 

 

…………………..…………….….

중략

…………………..…………….….

 

 

typedef CPArray< int, int > IntArray;

 

 

template< class TYPE, class ARG_TYPE >

inline void CPArray< TYPE, ARG_TYPE >::Shuffle( int nCount )

{

    for( INT_PTR i = 0; i < nCount; i++ )

    {

        for( INT_PTR j = 0; j < GetSize(); j++ )

        {

            Swap( m_pData[j], m_pData[ Rand( GetSize() ) ] );

        }

    }

}