※ 로또 프로그램 요약
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;
}
'예제 모음 > C/C++' 카테고리의 다른 글
| [C++] 두 점 사이의 거리 구하기 (0) | 2015.12.04 |
|---|---|
| [C언어] 두 점 사이의 거리 구하기 (0) | 2015.12.02 |
| [C++11] 중복없는 로또 프로그램2 (2) | 2015.11.29 |
| [C++11] 원 안에만 점 찍기 (0) | 2014.09.02 |
| [C언어] rand 함수를 이용한 로또 프로그램 (1) | 2014.04.08 |
| [C언어] 재귀 함수 - 10진수 -> 2진수 변환 (1) | 2014.03.20 |
| [C언어] 소수점 특정 자릿수 반올림하기 - ROUND 함수 (0) | 2014.03.14 |