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