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 미만 범위 안에서 균등하게 분포됩니다.