Programming Storytelling

랜덤함수 rand(),srand() 에 대하여 본문

C++

랜덤함수 rand(),srand() 에 대하여

HJdone 2019. 6. 8. 21:04

rand(),srand() 함수는 cstdlib 헤더파일에 존재한다. 

하지만 iostream헤더파일을 사용해도 된다.

 

먼저 rand()는 난수를 발생시키는 함수이다.

하지만 rand()는 정확히 말해서 난수를 발생시키는 것이 아니라 내부에 저장된 난수표에서 seed값에 따라 난수를 뽑아 오는 것 뿐이다. 그래서 이 seed값을 의도적으로 변경하지 않는 이상 항상 똑같은 난수를 뽑아내는 결과를 초래할 것이다. 따라서 진정한 의미의 난수를 발생시키기 위해서는 프로그램을 실행할 때마다 새로운 seed값을 설정해서 전혀 새로운 난수를 뽑아내도록 해야한다, 그 seed값을 설정하는 함수가 srand()이며 srand()는 time()로 현재의 시간(초)를 대입 해 주는 것이다. 이로서 프로그램 실행시마다 전혀 새로운 시간 값을 입력 할 수 있다.

srand()의 인수는 unsigned int 타입의 값이며 따라서 time()호출로 반환 된 time_t타입의 값을 unsigned int 타입으로 형변환 해야 한다. 


int test = rand() % (x+1); // 0부터 x사이의 수를 랜덤 출력

int test = rand() % (b-a+1) + a; // a부터 b사이의 수를 랜덤 출력


아래의 코드는 rand()만 활용한 결과이다. 랜덤함수가 매번 똑같이 출력된다.

#include<iostream>
#include<stdlib>
using namespace std;

int main() {
	for(int i = 0; i<5; i++) {
    cout<<rand()<<endl;
}

return 0;
}

 

이제 단점을 극복하는 srand()를 사용 한 코드를 살펴보자.

#include<cstdlib>
using namespace std;

int main() {

	srand((unsigned int)time(NULL));
    for(int i=0; i <5; i++) {
    	cout<<rand()<<endl;
        }
        return 0;
    }