휴가중인데.. 너무 심심해서.. 할 게 없어서.. c++로 로또 번호 생성기를 만들어보겠습니다.

기준은 우리나라 6/45 로또로 하겠습니다. 로또는 1~45까지 숫자 중 6개 숫자를 고르는거니까 이 기준에 맞춰서 만들어봅시다.



로또 사진




1. 발로 짠 버전

#include <ctime> #include <cstdlib> ... srand(time(NULL)); printf("%d %d %d %d %d %d\n", rand()%45+1, ...);

단순히 1~45까지 숫자를 뽑는다 * 6번 반복을 합니다.

'엥 그러면 겹칠 수 있지 않나?' -> 맞습니다ㅋ 아무리 귀찮아도 이렇게 짜면 노우노우;



2. 개선한 버전

#include <ctime> #include <cstdlib> #include <algorithm> #include <vector> ... srand(time(NULL)); vector<int> lotto;

while (lotto.size() < 6) {     int number = rand()%45 + 1;     if (std::find(lotto.begin(), lotto.end(), number) == lotto.end())         lotto.push_back(number);

} ... for (auto& n: lotto) {     printf("%d\n", n);

}

* 1. 로또 번호 배열을 만든다.
* 2. 로또 번호 배열 크기가 6이 될 때까지 밑 과정을 반복한다.
* (반복) 1~45 숫자를 하나 뽑고, 배열에 없으면 넣는다.

이번엔 확실히 로또 조건에 맞는 숫자가 나옵니다. 알고리즘도 간단하고, 길이도 짧고요.

문제는 라이브러리 떡칠이라 성능이 구릴 수 있다는 것. find도 여러번 쓰고..

고작 로또 번호 뽑는 프로그램이긴 하지만 좀 더 개선해봅시다.



3. 좀 더 개선한 버전

#include <ctime> #include <cstdio> #include <cstdlib> using namespace std; int main() { srand(time(NULL)); bool lotto[45] = {}; register unsigned char cnt = 0; register unsigned char number; do { number = rand()%45; if (!lotto[number]) { ++cnt; lotto[number] = true; } } while (cnt < 6); for (int i=0; i<45; ++i) { if (lotto[i]) printf("%d\n", i+1); } return 0; }

* 1. 로또 번호 bool 배열을 만든다.
* 2. 카운트가 6이 될 때까지 밑 과정 반복
* (반복) 0~44 숫자를 하나 뽑고, 로또배열[숫자]=false인 경우 카운트 1증가하고 로또배열[숫자]=true로 대입

이거 역시 긴 시간 안들이고 뚝딱 짠 건데 장점이라면 라이브러리가 필요없고 2번보다 나름? 아마? 효율적일겁니다..


'내가 짠 로또 생성기가 짱이다' 하시는 분은 댓글로 알려주세요

반응형

'프로그래밍 > C++' 카테고리의 다른 글

C++ 점과 점 사이의 거리  (0) 2019.05.04
bits/stdc++.h 파일 내용  (0) 2019.02.12
C++ std::string 숫자 여부 판별  (0) 2017.03.11
C++ std::set max element 찾는법  (0) 2017.01.18
C++ 랜덤 셔플  (0) 2016.11.20