본문 바로가기
프로그래밍/C || CPP

[C/C++] rand, srand로 랜덤 뽑기(로또/lotto) 프로그램 만들기

by _BlankSpace 2017. 6. 15.

 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()는 초마다 다르게 값을 생성할 수 있게 됩니다.



이러한 기능은 로또 프로그램 뿐만 아니라 여러 분야에서 자주 사용되는 기능이라고 할 수 있습니다. 랜덤으로 숫자를 생성하는 일이 없을 것 같지만, 개발을 하다보면 은근히 많았던 것 같습니다.


그러므로, 아주 간단한 함수지만, 아시면 유용한 함수라고 생각하여 포스팅해봤습니다.


이상 포스팅을 마치겠습니다. 글을 읽어 주셔서 감사합니다.


제 글이 도움이 되셨거나 공감이 되시는 부분이 있으셨다면, 밑에 있는 공감 버튼 한 번씩 꾸욱 눌러주시면 감사하겠습니다.


공감 버튼은 저에게 큰 도움이 됩니다. 감사합니다.



댓글