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());
}
계속해서 난수의 값을 바꾸고 싶다면 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());
}
위와 같이 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);
}
rand함수의 난수 범위는 0~32767로 매우 광범위합니다. 이러한 난수들의 범위를 한정시키고 싶다면 나머지 연산자를 활용하여 난수의 나머지를 구하여 활용하면 됩니다.
'Language > C , C++ , C#' 카테고리의 다른 글
[C언어/C++] 현재 날짜/시간 원하는 형태로 출력하기 (time, localtime) (0) | 2021.02.06 |
---|---|
[C언어/C++] 랜덤(rand)함수 활용 아이템 가챠 프로그램 (난수 생성) (0) | 2021.02.05 |
[C언어/C++] 키보드 입력 받기 (getch, kbhit) 함수 사용법 & 예제 (2) | 2021.02.04 |
[C언어/C++] 콘솔 화면 지우기(초기화) (0) | 2021.02.03 |