0. 서론 |
이번 포스팅은 rand()와 srand() 함수를 이용하여, GUI 없는 아주 간단한 로또 프로그램을 만들어 볼 생각입니다.
사실, 이 프로그램은 굉장히 간단합니다. 위에서 말한 것처럼 rand()와 srand()가 어떤 용도로 사용하는 것인지,
또한, C언어를 아주 조금만 알면 바로 만들 수 있을 정도의 난이도이기 때문입니다.
물론, GUI가 들어간다면 말이 달라지겠지만 말입니다. (그래도 조금 더 귀찮아질 뿐, 난이도는 차이가 없을 듯 합니다..)
1. rand() 함수는 뭘까. |
그러므로, 이번 포스팅의 목적이기도 한 rand, srand 함수에 대한 설명을 먼저 하겠습니다.
먼저, rand() 함수를 사용하기 위해서는 헤더파일을 추가해야 합니다.
rand() 함수는 stdlib.h을 포함해야 사용할 수 있습니다. 그 이유는 당연히 stdlib.h 헤더 파일에 rand()의 함수 원형의 정의가 있기 때문이겠습니다.
그럼 rand() 함수는 무슨 기능을 할까요?
rand()는 정수를 생성합니다. 하지만, 그냥 정수는 아닙니다. 이때의 정수는 0부터 생성할 수 있는 수까지 임의대로 생성됩니다.
그럼 rand() 함수를 이용하여, 난수를 생성하는 프로그램을 구현해보겠습니다.
lotto.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> #include <stdlib.h> // rand() #define MAX_NUM 6 int main(void) { int i; printf("간단한 랜덤 번호 생성기 입니다.\n"); printf(" 번호는 1 ~ 45 까지 생성됩니다.\n"); for (i = 0; i < MAX_NUM; i++) { printf("%d ", rand() % 45 + 1); // rand() 함수는 난수를 발생시킴 } return 0; } | cs |
결과는 랜덤으로 6개의 숫자가 생성되는 것을 확인하실 수 있으실 겁니다.
하지만 여기서 문제가 발생합니다. 혹시, 결과를 한번만 확인하시지 않으시고, 여러 번 확인해보셨습니까?
뭔가 이상함을 느끼셨을 겁니다. 값이 바뀌지 않는 문제 말입니다.
이러한 문제를 해결하기 위해서 srand() 함수가 필요합니다.
2. srand() 가 왜 해결사가 되는 걸까? |
srand()는 위에 문제를 해결하기 위해서 꼭 필요한 기능을 합니다.
srand()는 매번 난수를 다르게 발생시키기 위해서 시드(seed) 값을 주는 기능을 합니다.
이것은 seed를 이용하여, 초 단위로 변화시킵니다.
따라서, 다음과 같은 방법을 사용하면 위에 문제를 해결할 수 있습니다.
lottoPlus.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> #include <stdlib.h> // rand() #include <time.h> #define MAX_NUM 6 int main(void) { int i; printf("간단한 랜덤 번호 생성기 입니다.\n"); printf(" 번호는 1 ~ 45 까지 생성됩니다.\n"); srand(time(NULL)); //seed값 사용 for (i = 0; i < MAX_NUM; i++) { printf("%d ", rand() % 45 + 1); // rand() 함수는 난수를 발생시킴 } return 0; } | cs |
이것의 결과는 첫 번째 예제와는 다르게 매번 결과가 바뀐다는 것을 확인하실 수 있으실 겁니다.
그럼 위와 어떤 점이 다른 지 확인해보겠습니다.
가장 눈에 띄는 것은 13 번 라인인 것 같습니다.
13번 라인을 보시면 srand(time(NULL)); 이 있습니다.
이때, time(NULL)은 1970년 1월 1일 이후의 경과된 시간을 초 단위로 반환하는 함수입니다. 따라서 이 반환된 값을 함수 srand()의 인자로
주게 되면, 이 값을 시드 값으로 받은 srand()는 초마다 다르게 값을 생성할 수 있게 됩니다.
이러한 기능은 로또 프로그램 뿐만 아니라 여러 분야에서 자주 사용되는 기능이라고 할 수 있습니다. 랜덤으로 숫자를 생성하는 일이 없을 것 같지만, 개발을 하다보면 은근히 많았던 것 같습니다.
그러므로, 아주 간단한 함수지만, 아시면 유용한 함수라고 생각하여 포스팅해봤습니다.
이상 포스팅을 마치겠습니다. 글을 읽어 주셔서 감사합니다.
제 글이 도움이 되셨거나 공감이 되시는 부분이 있으셨다면, 밑에 있는 공감 버튼 한 번씩 꾸욱 눌러주시면 감사하겠습니다.
공감 버튼은 저에게 큰 도움이 됩니다. 감사합니다.
'프로그래밍 > C || CPP' 카테고리의 다른 글
const 멤버 함수와 비 const 멤버 함수 정리 (3) | 2017.09.14 |
---|---|
[C/C++] 전처리기 (0) | 2017.06.20 |
[C/C++] 함수포인터(function pointer) 정리 (0) | 2017.05.30 |
[C/C++] 연산자 정리 (0) | 2017.05.28 |
C/C++ cpp, h 파일 분할 방법 (0) | 2017.05.21 |
댓글