C언어 프로그래밍에서 코드를 작성하다보면 무작위의 숫자가 필요한 경우가 존재합니다.
보통 무작위 숫자를 난수라고 표현합니다.
C언어에서 난수를 표현하기 위해서는 라이브러리를 사용해야합니다.
※ 알고가기
라이브러리란 자주 사용하는 함수들을 미리 작성하여 저장해둔 파일로써 보통 헤더파일로 저장됩니다.
이 헤더파일은 #include 라는 코드를 통해 추가해 줄 수 있는데
C언어에서 기본적으로 사용하는 헤더파일은 stdio.h 이며 이는 Standard Input Ouput(표준 입출력)의 약자입니다.
사용방법은 프로그램 코드 맨 윗줄에 #include <헤더파일명.h> 또는 "헤더파일명.h" 으로 사용할 수 있습니다.
보통 < > 는 Standard Library Header에서 사용하며 " "는 User Defined Header를 사용할 때 쓰는것이라 알려져있는데 크게 틀린말은 아닙니다.
< >와 " "의 차이는
- < > : 컴파일러가 미리 정해놓은 위치에서 헤더파일을 찾습니다.
- " " : 컴파일러가 미리 정해놓은 위치에서 헤더파일을 찾고 만약 찾지 못한다면, < >로 바꾸어 헤더파일을 찾습니다.
로 생각하면 되겠습니다. 결국 Header파일을 읽은 것인지 Source파일을 읽을 것인지에 따라 사용을 구분하면 되겠습니다.
다시 본론으로 와서, C언어에서 난수를 만들기위해서는 rand()라는 함수를 사용하면 됩니다.
rand()함수는 stdlib.h 헤더파일에 포함되어있기 때문에 코드 맨 윗줄에 #include <stdlib.h>를 작성해 줍니다.
☞ rand()함수 사용법
#include <stdio.h>
#include <stdlib.h> // rand() 함수 포함 라이브러리
int main()
{
int random = 0; // 정수형 변수 선언
for (int i = 0; i < 10; i++) { // 10번 반복
random = rand()%9; // 난수 생성
printf("%d\n", random); // 출력
}
}
☞ 실행결과
8번째 줄을 보시면 random = rand()%9; 라는 코드가 있습니다.
해석하면 rand() 함수에 의해 난수를 생성하고 그 숫자를 9로 나눈 나머지를 random 변수에 대입하는 코드입니다.
※ 알고가기
rand() 함수에 의해 생성되는 난수 : 0 ~ 32767
rand() 함수에 의해 생성된 난수를 9로 나눈 나머지(%)의 값은 0부터 8까지입니다.
이를 1부터 9까지 난수를 생성하고 싶을때는 다음과 같이 8번째 줄 코드를 변경합니다.
random = rand()%9 + 1;
이는 0부터 8까지 반환되는 난수에 1을 더해줌으로써 1부터 9까지 반환할 수 있도록 하는 코드입니다.
하지만 여기서 문제점이 발생합니다.
분명 개발자가 원하는 난수를 생성하고 출력했지만 그 패턴(규칙)이 매번 일정하다는 겁니다.
다시말해, 프로그램 실행 시(또는 반복문) 항상 같은 난수가 생성된다는 겁니다.
이는 진정한 난수라고 말할 수 없죠.
그렇다면 프로그램 실행 시 매번 다르게 난수를 생성하는 방법은 무엇일까요?
그건 바로 srand()라는 함수를 사용하면 됩니다!
rand() 함수를 사용하기 전에 다음과 같은 코드를 추가합니다.
srand(time(NULL));
무슨뜻이냐면 srand()함수는 rand()라는 함수에 무작위의 시드값을 주기위한 함수이며 그 파라미터로 time(NULL)이라는 매개변수를 전달합니다.
time(NULL)은 1970년 1월 1일 이후 경과된 시간을 초 단위로 반환하는 함수입니다.
이로써 1초 단위로 매번 다른 시드값을 생성해 rand()함수를 호출하는 것입니다.
이해가 안가시는분은 그냥 이걸 써야 진정한 난수가 생성되는구나! 라고 생각하시면 됩니다.
물론 time()함수를 사용하기 위해서 #include <time.h>를 추가해주시는걸 잊지마세요!
☞ 진정한 난수 생성코드
#include <stdio.h>
#include <stdlib.h> // rand()함수 포함 라이브러리
#include <time.h> // time()함수 포함 라이브러리
int main()
{
srand(time(NULL)); // 매번 다른 시드값 생성
int random = 0; // 정수형 변수 선언
for (int i = 0; i < 10; i++) { // 10번 반복
random = rand()%9; // 난수 생성
printf("%d\n", random); // 출력
}
}
☞ 실행결과
3번 실행 한 결과 모두 다른 난수값이 생성되는것을 확인 할 수 있습니다!
이로써 진정한 난수 생성하는 방법 및 코드에 대해 알아보았습니다.
정보가 유익하셨다면 아래 공감버튼 눌러주시면 감사하겠습니다.
질문사항은 댓글로 달아주시면 성의껏 답변해드리겠습니다.
숫자를 랜덤으로 뽑아서 출력하게 하는 코드이다.
난수 생성기#include <stdio.h> #include <stdlib.h> //srand, rand를 사용하기 위한 헤더파일 #include <time.h> // time을 사용하기 위한 헤더파일 int main() { srand(time(NULL)); // 난수 초기화 for (int i = 0; i< 10; i++) // 10회 반복 { int random = rand() % 5; // 0 ~ 4 사이의 숫자를 뽑아서 random 변수에 저장 printf("%d ", random); // 출력 } return 0; }
(실행결과)
먼저, rand함수는 rand % (숫자) 를 함으로써 원하는 숫자의 범위를 지정할 수 있다.
ex) rand() % 5 => 0 ~ 4사이의 랜덤한 숫자
ex) (rand() % 5) + 1 => 1 ~ 5사이의 랜덤한 숫자
그리고 7번째 줄인 srand(time(NULL)); 이 필요한 이유는 컴퓨터 내부에 저장된 난수를 초기화 하기 위해서이다. srand(time(NULL)); 가 없게 되면 처음 실행할때 생성된 난수가 저장이 되어서 다음번 실행을 해도 계속 같은 결과값만 나오게 된다.
srand(time(NULL));이 빠졌을때#include <stdio.h> #include <stdlib.h> int main() { for (int i = 0; i< 10; i++) { int random = rand() % 5; printf("%d ", random); } return 0; }
(실행결과)
둘이 같은 사진처럼 보이지만 다른 사진이다.
하지만 srand(time(NULL)); 을 사용하게 된다면, 실행 할 때마다 새로운 결과값이 나오게 될 것이다.