Channi Studies

[C++] 랜덤 숫자 random number 본문

C++/기타

[C++] 랜덤 숫자 random number

Chan Lee 2023. 12. 16. 14:53

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))로 시드를 지정한다'

를 이해하는 것이 중요한 코드였습니다.


 

실행 결과

실행 결과