[C언어/C++] 랜덤함수(rand, srand, time) 사용법 & 예제 (난수 생성)

C/C++로 개발을 하다 보면 종종 난수가 필요할 경우가 많습니다. C/C++에서는 이처럼 난수를 생성하는 rand() 함수와 srand() 함수가 있습니다. rand()함수는 난수의 생성 패턴을 한개로 설정하는 것이고 srand()함수는 난수의 생성 패턴을 여러개로 설정하는 차이가 있습니다. 이 함수들이 들어있는 헤더파일을 확인해보면 #define RAND_MAX 0x7fff라는 매크로 상수가 선언되어 있습니다. 즉 RAND_MAX는 0x7fff인데 이는 10진수로 32767입니다. 따라서 난수 의 범위는 0~32767가 되게 됩니다. 

 

 랜덤함수를 사용하여 난수 생성하기 

헤더 파일

//C언어
#include<stdlib.h> //rand(), srand()
#include<time.h> //time()

//C++
#include<cstdlib> //rand(), srand()
#include<ctime> //time()

C언어에서 사용하는 랜덤 함수(rand)를 사용하려면 <stdlib.h> 헤더 파일을, C++에서 사용하는 랜덤 함수인(srand)을 사용하려면 <cstdlib>를 헤더를 포함시켜야 합니다. 그리고 이 난수 함수를 정말로 랜덤하게 사용하기 위해서는 seed값으로 현재시간을 넣어주어야 하기에 현재시간을 출력해줄 수 있는 헤더 파일도 포함하도록 합시다.

 

랜덤(rand) 함수 사용 예제

//C언어
#include <stdio.h>
#include <stdlib.h>

//C++
#include <iostream>
#include <cstdlib>

void main()
{
    printf("난수 : %d\n", rand());
    printf("난수 : %d\n", rand());
    printf("난수 : %d\n", rand());
    printf("난수 : %d\n", rand());
    printf("난수 : %d\n", rand());
}

난수 생성 예제

위의 예제에서 rand() 함수를 사용 난수를 5개를 출력하는 예제를 5번 실행시킨 결과입니다. 위의 그림을 보시면 한번 실행된 콘솔에서는 계속해서 난수가 변환되는 것을 보실 수 있습니다. 하지만 콘솔을 다시 실행시키면 초기화된 후 이전에 실행하여 구했던 난수들과 똑같은 값이 나왔습니다. 이렇게 된다면 콘솔을 재 실행시킬 때마다 같은 값이 나오게 되어 우리가 원했던 무작위 값과는 거리가 멀게 됩니다.

 

몇 번을 재 실행해도 같은 결과값이 나오는 이유는 컴퓨터에서 난수를 생성하는 방법 때문입니다. 컴퓨터에서는 난수를 생성하는 방법을 seed값을 두고 그 seed값을 특정 공식으로 구해서 계속해서 난수를 생성합니다. 특정 값을 같은 공식으로 계산하면 몇번을 실행해도 같은 값이 되겠지요. 

 

랜덤(rand)함수에 seed값을 부여하는 srand 함수 사용 예제

//C언어
#include <stdio.h>
#include <stdlib.h>

//C++
#include <iostream>
#include <cstdlib>

void main()
{
    srand(10); // seed값 부여 지정하지 않는다면 1
    printf("난수 : %d\n", rand());
    printf("난수 : %d\n", rand());
    printf("난수 : %d\n", rand());
    printf("난수 : %d\n", rand());
    printf("난수 : %d\n", rand());
}

난수 생성 예제2

계속해서 난수의 값을 바꾸고 싶다면 rand함수의 seed값을 바꿔줘야 합니다. srand(seed) 함수에서 seed값을 설정할 수 있습니다. 참고로 srand함수를 사용하지 않는다면 자동으로 seed값은 1이 됩니다. 위의 예제에서 srand의 인자 값을 계속해서 바꾸어가며 실행시켜보세요. 그렇다면 각각 다른 난수들이 출력됩니다. 하지만 이 방법도 실제 사용하기에는 많이 부족합니다. 다른 난수의 값을 출력시키고 싶다면 수동으로 seed값을 계속해서 바꾸어주어야 하기 때문이죠. 그렇다면 자동으로 seed값이 바뀌게 할 수는 없을까요? 있습니다. 바로 현재시간을 seed값으로 넣으면 됩니다.

 

현재시간을 Seed값으로 부여하여 무작위 난수 출력하기

//C언어
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//C++
#include <iostream>
#include <cstdlib>
#include <ctime>

void main()
{
    srand((unsigned int)time(NULL)); //seed값으로 현재시간 부여 
    printf("난수 : %d\n", rand());
    printf("난수 : %d\n", rand());
    printf("난수 : %d\n", rand());
    printf("난수 : %d\n", rand());
    printf("난수 : %d\n", rand());
}

난수 생성 예제3

위와 같이 seed값으로 현재 시간을 넣으면 초당 seed값이 계속해서 변화하기 때문에 실행할 때마다 랜덤한 난수의 값들을 얻을 수 있습니다.

 

% 나머지 연산자를 사용하여 난수의 범위 한정시키기

//C언어
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//C++
#include <iostream>
#include <cstdlib>
#include <ctime>

void main()
{
    srand((unsigned int)time(NULL)); //seed값으로 현재시간 부여 
    
    // 난수 %10 = 난수의 범위 0~9까지 한정
    printf("난수 : %d\n", rand() % 10);
    printf("난수 : %d\n", rand() % 10);
    printf("난수 : %d\n", rand() % 10);
    printf("난수 : %d\n", rand() % 10);
    printf("난수 : %d\n", rand() % 10);
}

난수 생성 예제4

rand함수의 난수 범위는 0~32767로 매우 광범위합니다. 이러한 난수들의 범위를 한정시키고 싶다면 나머지 연산자를 활용하여 난수의 나머지를 구하여 활용하면 됩니다.

댓글

Designed by JB FACTORY