[C++11] 중복없는 로또 프로그램

예제 모음/C/C++2015. 11. 27. 13:14

※ 로또 프로그램 요약
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;
}

 

 

작성자

Posted by 사용자 오뇽

태그

관련 글

댓글 영역

  • 프로필 사진
    2015.11.27 13:59 신고

    로또 번호 생성은 처음에 배열을 1~45의 숫자로 초기화 한 다음에
    배열을 랜덤 셔플 하고, 앞 6개 숫자를 정렬해서 출력하는 단순한 알고리즘도 괜찮더라구요.
    http://ideone.com/hMqyVb

    • 프로필 사진
      2015.11.27 14:08 신고

      오 생각하지 못 했던 방법이네요, 좋은 정보 감사합니다.
      random_shuffle가 속도도 괜찮으면 좋겠는데... 말 나온 김에 조만간 속도 테스트 해서 또 글올리도록 하겠습니다 ㅎㅎ

    • 프로필 사진
      2015.11.27 15:26 신고

      random_shuffle이 C++14에서 deprecated되고 shuffle로 대체된듯 하네요.. 이런식으로 써야 하는것 같아여 http://ideone.com/I5AYos 난수생성기는 mt19937_64이 빠르다고 하셔서 mt19937_64로 해봤어요

  • 프로필 사진
    월터
    2016.05.24 00:08

    리눅스에서 -std=c++11 옵션을 주어야만 컴파일 가능하지요?

    • 프로필 사진
      2016.05.25 22:27 신고

      아뇨 gcc 버전이 4.7인가 4.8이상이면 그냥 하면 됩니다. 디폴트 모드가 최신 버전에 맞게 되있거든요. -std=gnu++14나 -std=gnu++98 같은 옵션은 하위 버전으로 컴파일할때 하는걸로 알고 있어요