C++에서 랜덤한 숫자를 얻는 법을 알아보겠습니다.
우선, 저희가 사용할 함수들이 포함된 <cstdlib> 헤더를 포함시킵니다.
(추가적인 정보는 https://en.cppreference.com/w/cpp/header/cstdlib 에 있습니다.)
#include <iostream>
#include <cstdlib> // cstdlib 헤더 추가
그리고 저희가 원하는 랜덤 숫자의 범위를 선택하기 위한 두가지 변수를 선언합니다.
저는 주사위에서 처럼 1과 6을 고르겠습니다.
주의할 점은 1과 6이 제외된 2-5의 범위가 대상이 아니고, 1과 6을 포함해서 1~6 사이에서 숫자가 결정됩니다.
(이름은 원하시는대로 하면 됩니다.)
다음으로는 몇번의 숫자를 출력하고 싶은지를 선언합니다.
이 방법은 꼭 선언으로 하지 않더라도 for문 등 다양한 방법이 있으나,
이해하기 쉽게 변수 선언으로 하겠습니다.
int min {1}; // 랜덤 숫자 최소 범위
int max {6}; // 랜덤 숫자 최대 범위
int count {10} // 총 10번 랜덤 숫자를 받겠습니다.
다음으로는 중요한 부분인데, 랜덤 함수의 시드를 지정해야합니다.
시드를 지정해주지 않은 상태로 랜덤 함수가 포함된 프로그램을 사용하게 되면,
sequence, 즉 순서가 동일한 랜덤 숫자가 계속 나옵니다.
몇번이고 프로그램을 실행해도 같은 결과가 나온다는 뜻입니다.
이런 문제를 해결하기 위해, 실행할 때 마다 바뀌는 정보인 시간 정보를 이용하겠습니다.
다시 처음으로 돌아가서 <ctime> 헤더를 포함해줍니다.
해당 헤더는 time과 같은 시간과 관련된 함수들을 사용하게 해줍니다.
#include <ctime>
그리고 srand(time(nullptr)) 을 통해 실행시마다 달라지는 현재 시간을 기반으로 랜덤 시드를 설정합니다.
srand()는 랜덤 시드를 설정하는 역할입니다.
time(nullptr))은 현재 시간을 정수로 반환합니다.
( time(0)으로 사용해도 무방합니다. )
srand(time(nullptr))
이제 시드 설정이 끝났으니 랜덤 숫자를 받기만 하면 됩니다.
이후, 아까 설정한 랜덤 출력 횟수인 count 수 만큼 for문을 반복시키겠습니다.
그리고 for 문 내부에서, rand() % max + min 을 통해 랜덤 넘버를 받을 것입니다.
rand()는 0부터 RAND_MAX 까지의 랜덤 정수를 반환합니다.
(RAND_MAX값은 기기마다 다릅니다. 제 경우는 2147483647 이네요.)
즉 (0 - 2147483647) % max(6) = (0 ~ 5)의 값입니다.
여기서 우리는 (1 ~ 6)의 값을 얻길 원했기 때문에, 처음 설정한 min 값, 1을 더합니다.
그러면 (1 ~ 6)의 랜덤 값을 받을 수 있겠죠?
이 모든 걸 합친 코드는 다음과 같습니다.
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
int main() {
int min{1};
int max{6};
int count{10};
srand(time(nullptr));
for (size_t i{1}; i <= count; i++) {
int rand_num{rand() % max + min};
cout << rand_num << endl;
}
return 0;
}
랜덤 숫자를 받을 때, 'rand() 함수 이전에 srand(time(nullptr))로 시드를 지정한다'
를 이해하는 것이 중요한 코드였습니다.
실행 결과
'C++ > 기타' 카테고리의 다른 글
[C++] vscode 디버깅 세팅 기록 (0) | 2023.12.23 |
---|---|
[C++] 추가적인 변수 선언 없이 값 교환하기 (swap) (1) | 2023.12.19 |
[C++] <iomanip> setprecision(n) (0) | 2023.12.10 |
[C++] Compund Assignment Operator (0) | 2023.12.07 |
[C++] c++에서 boolean 값을 true/false로 출력하고 싶을 때 (0) | 2023.12.07 |