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번 실행 한 결과 모두 다른 난수값이 생성되는것을 확인 할 수 있습니다!

이로써 진정한 난수 생성하는 방법 및 코드에 대해 알아보았습니다.





정보가 유익하셨다면 아래 공감버튼 눌러주시면 감사하겠습니다.

질문사항은 댓글로 달아주시면 성의껏 답변해드리겠습니다.



'C, C++' 카테고리의 다른 글

C/C++ 구조체 사용법 및 예제  (1) 2018.10.08
C/C++ 배열 사용법  (0) 2018.10.05
C 파일처리  (0) 2018.10.02
C++ 벡터 사용법  (2) 2018.09.26
C언어 포인터  (8) 2018.09.25
C++ 자바 상속 비교  (0) 2018.09.08
C++ String 문자열 사용법 정리  (0) 2018.08.20
[C++] C# 연동하기 / C# dll 파일 만들기  (1) 2018.08.18

to Top