정보처리 산업기사 실기

C언어 난수 관련 함수 rand() / srand() / time()

유혁스쿨 2021. 3. 11. 19:16
728x90
반응형

rand() / srand() 함수는 C언어의 stdilb.h 헤더파일에 정의된 난수에 관련된 C언어의 내장함수이다

 

우선 rand 함수는 0에서 32767 사이의 난수를 발생시키는데, 이때 인수를 지정하지 않으면 rand함수가 실행될 때 마다

41,6334, 19169, 11478, 26962, 5705, ... 과 같이 dafault로 고정된 난수 값이 발생한다.

#include<stdio.h> 
#include<stdlib.h>

int main(void) {
	while(a<=9){
		printf("rand 난수 : %d\n", rand());
	}
}

이렇게 되면 아무리 프로그램을 많이 실행시켜도 고정된 동일한 숫자가 나오게 된다.

매번 실행시켜도 그 순서까지도 똑같이 나온다.

 

이때, 새로운 난수를 발생시키려면 srand()함수로 난수의 기준 값을 설정해야 한다.

srand는 rand함수에서 난수의 기준이 되는 값(seed) 즉, rand함수에 사용될 수를 초기화 하는 역할을 한다.

이 초기화를 매개변수로 받는 seed값을 이용해서 한다.

srand(seed) 이렇게 말이다.

 

#include<stdio.h> 
#include<stdlib.h>

int main(void) {
	srand(11342) // srand함수를 사용하여 임의의 seed값 지정
	while(a<=9){
		printf("rand 난수 : %d\n", rand());
	}
}

 

rand 함수는 기본 내부적으로 어떤 srand의 매개변수로 들어온 seed값과 매칭되는 숫자가 정해진다.

앞에서 말한 rand함수의 고정된 난수값의 특징을 보면 default로 seed값이 정해져있다는 것을 유추 할 수 있다.

그렇기 때문에 srand 함수의 seed값에 의해서 rand함수의 결과값이 변할 수 있게 된다.

 

하지만 srand 함수도 seed값이 계속 동일하다면 특정 seed값에 대한 rand값이 정해져 있기 때문에 seed별로 고정된 동일한 숫자가 나오게 된다.

때문에 동일한 seed를 계속 사용한다면 의사난수(특정 알고리즘에 의해 생성되는 수) 즉, 규칙을 통해 고정된 난수 값만이 발생한다.

 

 

 

그렇기 때문에 프로그램 실행(런타임)중 항상 변하는 seed값을 이용해서 srand를 해 줄 필요가 있다.

항상 변하는 seed값으로는 보통 time함수를 사용해서 'srand(time(NULL))'와 같이 난수의 기준 값을 현재 시간으로 설정해 매번 다른 난수가 발생되도록 하여 사용한다.

#include<stdio.h> 

/* rand(), srand()함수가 내장된 헤더파일*/
#include<stdlib.h>

/* time()함수가 내장된 헤더파일*/
#include<time.h> 

int main(void) {
	srand(time(NULL)) // srand함수의 임의의 seed값을 항상 변할수 있도록 time으로 지정
	while(a<=9){
		printf("rand 난수 : %d\n", rand());
	}
}

 

time() 함수가 하는 일은 UCT 기준 1970년 1월 1일 0시 0분 0초 부터 경과된 시간을 초(sec) 단위로 변환하는 함수이다.

이렇게 초로만 반환을 해서 연도,  월, 일, 시, 분, 초 로 나타내기 위해서는 다른 작업이 필요하거나, 다른 함수를 이용해서 날짜를 얻어 올 수도 있겠지만, 현재는 난수에 필요한 시드값을 구하는 것 이기 때문에 시간이 아니라 항상 변화하는 숫자가 필요하다.

그렇기 때문에 srand를 통해 time 함수를 사용할 때에는 시간이 아닌 항상 변화하는 숫자로 이해하고 사용한다.

 

time() 함수의 기본 형태와 난수를 사용할때의 형태를 알아보자.

time_t time(time_t * timer);
/* 	반환 형 :time_t 데이터 타입
	매개 변수 : time_t의 포인터 타입 - (*timer) */
time_t t;
time(&t); //현재 시간을 초단위로 변경해서 t 변수에 저장한다.

timer에는 시스템의 시간을 얻는 time_t 타입의 자료형을 갖는 변수의 포인터를 지정한다.

time_t 타입 자료형은 time.h 헤더파일에 정의되어 있는 시간을 나타내는 산술형의 typedef 명 이다.

time_t 타입 자료형의 실제 형식은 구현에 따라 달라진다.

time() 함수는 인수에서 얻은 값과 같은 값을 반환하게 된다.

즉, time() 함수는 시간을 얻는 수단으로 포인터에 간접 참조에서 값을 저장하는 방법 및 반환 값에서 얻는 방법을 선택할 수 있다.

time_t t;
t = time(NULL); //현재 시간을 초단위로 변경하여 time_t타입 변수 t에 저장.

반환 값을 얻는 경우는 인수를 NULL로 해도 상관 없다.

 

728x90
반응형