kyuseo의 게임 프로그래밍
숫자를 섞어서 중복 없이 산출하는 방법 (Shuffle Number) 본문
개요.. |
숫자를 섞어서 중복 없이 산출하는 방법 (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() ) ] ); } } } |