본문 바로가기
프로그래밍 언어/C 언어

[C / C++] 난수 생성 (rand, srand, time)

by 까망 하르방 2021. 2. 23.
반응형
해당 게시글은 난수를 생성하는 rand, srand, time 함수에 대해서 다룹니다.
※ Random한 값을 난수라고 표현합니다.
※ 실행할 때마다 다르게 난수를 생성하는 방법은 ③ srand() 인자로 시간을 인자로 주는 형태입니다.
 

① rand

필요한 헤더파일:  C언어 <stdlib.h> /  C++ <cstdlib>

#include <stdio.h>
#include <stdlib.h>
int main(void){
    for (int i = 0; i < 5; ++i) {
        printf("rand : %d\n", rand());
    }
}

랜덤한 숫자이기 하지만 실행할 때마다 동일한 (랜덤) 숫자를 생성하는 단점이 있습니다.

생성되는 난수의 범위는 0 ~ RAND_MAX 까지 입니다.

(RAND_MAX는 0x7fff로 10진수로 0 ~ 32767가 생성 범위 입니다.

 

※ RAND_MAX는 stdlib.h 헤더파일에 정의되어 있는 수치 입니다.

(함수명에서 F12를 누르면 헤더파일을 쉽게 확인할 수 있습니다.)

[stdlib.h에서 344번째 줄]

 

② srand

필요한 헤더파일:  C언어 <stdlib.h> /  C++ <cstdlib>

rand() 함수는 srand함수에 의존적입니다.

srand의 "s"는 seed라는 뜻으로 인자로 주어진 수치에 따라 rand() 값을 변경시킵니다.

(양의 정수만 seed 인자로 줄 수 있습니다.)

(srand 함수를 호출하지 않고, rand() 호출한다면 srand(1)로 설정된 상태라고 보시면 됩니다.)

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

int main(void){
   
    printf("1....\n");
    srand(1);
    for (int i = 0; i < 5; ++i) {
        printf("rand : %d\n", rand());
    }
    printf("\n2....\n");
    srand(2);
    for (int i = 0; i < 5; ++i) {
        printf("rand : %d\n", rand());
    }
}

void srand(unsigned int seed);로 생성되는 랜덤값을 변화시켰지만

실행할 때마다 동일한 Pattern의 랜덤 값을 생성하는 단점은 여전합니다.

매번 실행할 때마다 다른 랜덤값을 가지게 하는 방법으로는 인자로 "시간"을 주는 것입니다.

 

③ srand + time

필요한 헤더파일:  C언어 <stdlib.h>, <time.h> /  C++ <cstdlib>, <ctime>

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

int main(void){
   
    printf("1....\n");
    srand(time(NULL));
    for (int i = 0; i < 5; ++i) {
        printf("rand : %d\n", rand());
    }
   
    printf("\n2....\n");
    srand(time(NULL));
    for (int i = 0; i < 5; ++i) {
        printf("rand : %d\n", rand());
    }
}

하나의 실행단위에서는 실행되는 시점에서 시간의 큰 변화가 없기 때문에 동일한 seed가 주어진 결과가 나왔습니다.

하지만 srand(time(NULL));사이에 시간이 어느정도 소용되는 구간이 발생한다면 다른 결과가 나올 것입니다. 

실제 다른 시간에 동일한 코드를 실행하면 다른 값이 나오는 것을 확인할 수 있습니다.

 

※ time 함수: UCT 기준 1970년 1월 1일 0시 0분 0초 부터 경과된 시간을 초(sec)로 반환하는 함수

    time 함수를 이용해서 연/월/일/시/분/초로 표현하기 위해서는 추가적인 작업이 필요하지만, 

    매 시간마다 다른 수치를 srand() 인자로 주는 것이 목적이므로 생략

    (time(NULL)은 반환형이 time_t인데 time_t는 long long 타입 입니다.)

 

반응형

댓글