C++ 랜덤 함수 - c++ laendeom hamsu

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); // 출력

}

}

☞ 실행결과

C++ 랜덤 함수 - c++ laendeom hamsu

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;
}

(실행결과)

C++ 랜덤 함수 - c++ laendeom hamsu

먼저, 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;
}

(실행결과)

C++ 랜덤 함수 - c++ laendeom hamsu
첫번째 실행
C++ 랜덤 함수 - c++ laendeom hamsu
두번째 실행

둘이 같은 사진처럼 보이지만 다른 사진이다.

하지만 srand(time(NULL)); 을 사용하게 된다면, 실행 할 때마다 새로운 결과값이 나오게 될 것이다.