※ 로또 프로그램 요약
C++11 문법을 이용하여 제작한 간단한 로또 프로그램이다.

전에 C언어로 제작한 로또 프로그램을 C++11 문법으로 리팩토링 하였다.

알고리즘 및 큰 흐름은 거의 같고 문법만 C에서 C++11로 바꿨으니 둘을 비교하면서 보면 좋을 것이다.


※ 로또 프로그램 특징
- C++11에 추가된 새로운 random(Mersenne Twister)을 이용하여 속도가 빠르고 품질이 좋다.

- 중복 판별을 위한 인덱스를 따로 관리하여 요소 개수가 많더라도 중복 판별에 상수 시간 복잡도를 갖을 수 있어 매우 빠르다.

- 표준 문법으로만 작성하여 윈도우, 리눅스 모두 컴파일 가능하다. (단 VS2013(12.0) 이상, gcc 4.8 이상)

 

#include <iostream>	//std::cout
#include <random>		//std::mt19937_64
#include <array>		//std::array
#include <algorithm>	//std::sort
#include <functional>	//std::greater

#define _NUMBER_MAX 6
#define _LOTTTO_MAX 45

int GetNumber( const int nMin, const int nMax );
std::ostream& operator<<( std::ostream& ostr, const std::array<int, _NUMBER_MAX>& arr );

int main( )
{
	//변수 선언
	std::array<int, _NUMBER_MAX> nNumber = { 0, };	//생성된 번호가 담길 배열
	std::array<bool, _LOTTTO_MAX> bIndex = { false, };	//빠른 중복 판단을 위한 배열 

	//번호 생성
	for( unsigned int i=0 ; i<nNumber.size() ; )
	{
		const auto nTempNum = GetNumber( 1, _LOTTTO_MAX );	//랜덤으로 번호 생성

		if( bIndex[nTempNum-1] == false )			//생성된 번호와 인덱스를 비교
		{
			bIndex[nTempNum-1] = true;			//생성된 번호와 인덱스 값 변경
			nNumber[i++] = nTempNum;			//생성된 번호 삽입
		}
	}

	//정렬, 주석을 지우면 내림차순 정렬한다.
	std::sort( nNumber.begin(), nNumber.end()/*, std::greater<int>( )*/ );
	
	//출력
	std::cout<<nNumber;

	return 0;
}

int GetNumber( const int nMin, const int nMax )
{
	std::random_device rn;		//시드 값
	std::mt19937_64 rnd( rn() );	//random_device를 시드 값으로 하여 초기화

	//랜덤의 범위를 지정
	std::uniform_int_distribution<int> nDist( nMin, nMax );
	
	return nDist( rnd );
}

std::ostream& operator<<( std::ostream& ostr, const std::array<int, _NUMBER_MAX>& arr )
{
    for( auto &i : arr )
    {
        ostr<<" "<<i;
    }

    return ostr;
}

 

 

+ Recent posts