Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++11 라이브러리로 난수 생성하기

C++11부터 표준 라이브러리에 포함된 <random> 헤더를 사용하면 외부 라이브러리 없이도 고품질 난수를 손쉽게 생성할 수 있습니다. 기존의 rand() 함수보다 난수 품질이 뛰어나고 다양한 분포를 지원하기 때문에, 현대 C++에서 난수 생성은 이 라이브러리를 활용하는 것이 권장됩니다.

아래 예제에서는 random_device 객체를 단 한 번 사용해 mt19937 난수 생성기의 시드(seed)를 설정했습니다. random_device는 mt19937에 비해 속도가 느리지만 별도의 시드 지정이 필요 없으며, 운영체제로부터 실제 무작위 데이터를 직접 요청해 가져옵니다. 그래서 일반적으로 프로그램 시작 시 한 번 호출되어 시드 공급자 역할을 맡습니다.

주요 구성 요소

  • random_device: 운영체제에서 제공하는 비결정적 난수를 생성합니다. 주로 다른 난수 생성기의 시드 값으로 활용됩니다.
  • mt19937: 메르센 트위스터(Mersenne Twister) 알고리즘 기반의 32비트 의사난수 생성기로, 빠른 속도와 매우 긴 주기가 특징입니다.
  • uniform_real_distribution: 지정한 구간 [a, b) 내에서 균등하게 분포하는 실수 난수를 생성합니다.

예제 코드

#include <random>
#include <iostream>
using namespace std;

int main() {
    random_device rd;
    mt19937 mt(rd());
    uniform_real_distribution<double> dist(20.0, 22.0); // 범위: 20 ~ 22
    for (int i = 0; i < 20; ++i)
        cout << dist(mt) << endl;
}

실행 결과

21.5311
21.7195
21.0961
21.9679
21.197
21.2989
20.6333
20.441
20.7124
20.2654
21.1877
20.4824
20.0575
20.9432
21.222
21.162
21.1029
20.2253
21.5669
20.3357

프로그램을 실행할 때마다 random_device가 새로운 시드를 제공하므로, 위 결과와 동일한 값이 아닌 매번 다른 숫자가 출력됩니다. 모든 값은 20.0 이상 22.0 미만 범위 안에서 균등하게 분포됩니다.