본문 바로가기

공부/프로그래밍

[C++] 난수 생성 기초

난수란 랜덤한 수로 프로그래밍시 랜덤한 값을 출력하거나 랜덤한 값을 선택할 때 필요한 함수입니다.

게임을 예로 들면 상자를 열었을 때 랜덤한 아이템이 나오게 하기 위해서는 이 난수가 필요하다고 할 수 있죠.

 

C++에서 난수 발생을 위해서 필요한 헤더는

#include <cstdlib> 이고

 

헤더 안 함수는

rand() : 1~32767 중 랜덤의 수가 나오는 함수, 정수형

srand() : 랜덤 시작의 씨앗값 설정 함수

RAND_MAX : rand의 최댓값 = 32767

가 있습니다.

 

여기서 처음 배울 때 의문이 드는 건 srand 함수이고 씨앗값이란 단어입니다.

설명을 드리자면 rand() 함수는 지정해주면 무작위적으로 선택하지 않고 '출발점'이란 게 존재합니다.

그래서 이 출발점을 바꿔주지 않으면 프로그램을 몇번을 실행해도 똑같은 수가 나옵니다.

난수 함수라고 해놓고 어울리지 않는 결과지요.

 

해결법은 씨앗값을 계속 변동시키는 것으로 여기서 배울 것은 #include <ctime> / time(NULL)을 이용하는 것입니다.

time(NULL)은 1970년 1월 1일 이후의 초로 세계 표준시 UTC를 기준으로 하는 것으로서 컴퓨터 내부 시간과 연동됩니다.

즉 이것을 사용하면 씨앗값을 자동으로 계속 기준을 바꿔줄 수 있으므로 간단히 랜덤한 난수를 만드는 데 이용할 수 있습니다.

srand((unsinged)time(NULL)이 씨앗값을 시시각각 바꿔주는 역할을 합니다.

*(unsigned)는 형변환으로 long -> unsigned int로 바꿔준다. 혹시 있을 자료형으로 인한 오류를 방지하고 부호를 +로 바꿔줌으로써 범위를 두배로 확장시켜준다.


가장 간단한 난수 발생 코드 예제

#include <iostream>
#include <cstdlib>
#include <ctime>           // 헤더 선언

using namespace std;

int main()
{
 int a;
 
 srand((unsigned)time(NULL));
 a=rand();
 cout<<a<<endl;


 return 0;
}


여기서 난수 발생의 범위를 1~32767이 아닌 1~20 정도로 하고 싶다.

그러면 rand()%21로 해주면 발생된 난수를 21로 나눈 나머지만이 나오므로 결과값이 0~20이 나오게 됩니다.

 

posting end.

728x90