랜덤 함수를 사용하기 위해선 random 헤더를 포함해야 합니다.(srand, rand 함수만 사용하려면 stdlib.h를 포함)
랜덤한 수를 가져오기 위해서는 rand 함수를 사용합니다. rand 함수는 0부터 RAND_MAX(32767)까지의 랜덤 한 값을 출력합니다.
int rand();
그런데 이 랜덤 함수가 겉으론 랜덤이지만 실제로는 함수가 호출될 때마다 일정한 패턴으로 바뀌어 호출되므로 프로그램을 실행할 때마다 같은 숫자가 출력됩니다. 이를 방지하기 위해서는 시작 수를 정해주어야 하는데 다음 함수를 사용합니다.
void srand(unsigned int seed);
seed에 처음 시작 수를 넣어주면 되는데 이 수는 프로그램 실행마다 달라야 됩니다. 실행마다 달라질 수 있는 대표적인 수로는 시간이 있습니다.
srand(time(nullptr));
이렇게 하면 실행마다 달라지는 랜덤 수를 구할 수 있습니다.
그리고 0부터 x-1 범위 중 랜덤 한 숫자를 출력하고 싶으면 rand()에 x의 나머지를 구하면 됩니다.(rand() % x)
위 방법은 C언어에서 지원했던 방법이지만 C++11에서 mersenne_twister_engine이라는 새롭고 더 랜덤성이 있는 알고리즘을 지원합니다.
#include <stdio.h>
#include <random>
int main() {
std::random_device rd;//하드웨어 속에서 결정되는 임의의 값(time(nullptr)와 같이 실행시마다 달라집니다.)
std::mt19937 mt(rd());//위의 rd()를 생략하고 mt.seed(rd());를 추가하는 것도 가능합니다.
std::uniform_int_distribution<int> uniformInt(0, 4);//0부터 4까지의 정수 범위를 생성합니다.
std::uniform_real_distribution<double> uniformDouble(0, 4);//0부터 4까지의 실수 범위를 생성합니다.
printf("%d\n", mt() % 5);//임의의 수에 5 나머지
printf("%d\n", uniformInt(mt));//0 ~ 4의 범위의 랜덤한 정수
printf("%f\n", uniformDouble(mt));//0 ~ 4의 범위의 랜덤한 실수
return 0;
}