C++ <random>헤더를 사용해 난수 생성하는 방법
1. 헤더 파일 포함
#include <random>
2. 시스템 기반 난수 시드 생성
시스템에서 제공하는 하드웨어 기반 난수 시드를 가져온다.
std::random_device rd;
3. 난수 생성 엔진 초기화
시드를 사용해 난수 생성 엔진을 초기화한다. 보통은 Mersenne Twister 알고리즘을 사용한 std::mt19937 엔진을 많이 사용한다.
std::mt19937 gen(rd()); // Mersenne Twister 엔진에 시드 할당
4. 분포 정의 (범위와 형식 설정)
난수가 발생할 범위와 형식은 분포(distribution)를 통해 정의한다.
- 정수형 균등 분포, 범위 내의 모든 값이 동일한 확률로 선택된다.
std::uniform_int_distribution<> dis(1, 10);
- 실수형 균등 분포
std::uniform_real_distribution<> dis(1, 10);
- 정규 분포(=가우시안 분포) , 평균을 중심으로 대부분의 난수가 발생하고 평균에서 멀어질수록 난수 발생 확률이 낮아지는 종 모양 분포 곡선을 그린다.
std::normal_distribution<> dis(50, 10);
5. 난수 생성
난수 생성 엔진과 분포를 결합하여 실제 난수를 생성한다. 호출할 때마다 새로운 난수를 반환한다.
int random_value = dis(gen);
- 사용 예시
#include <iostream>
#include <random>
int main() {
std::random_device rd;
std::mt19937 gen(rd());
// 정수 균등 분포 (1-10)
std::uniform_int_distribution<> int_dist(1, 10);
std::cout << "Uniform int distribution (1-10): ";
for (int i = 0; i < 10; ++i) {
std::cout << int_dist(gen) << " ";
}
std::cout << std::endl;
// 실수 균등 분포 (1-10)
std::uniform_real_distribution<> real_dist(1, 10);
std::cout << "Uniform real distribution (1-10): ";
for (int i = 0; i < 10; ++i) {
std::cout << real_dist(gen) << " ";
}
std::cout << std::endl;
// 정규 분포 (평균 5, 표준편차 1)
std::normal_distribution<> normal_dist(5, 1);
std::cout << "Normal distribution (mean=5, stddev=1): ";
for (int i = 0; i < 10; ++i) {
std::cout << normal_dist(gen) << " ";
}
std::cout << std::endl;
return 0;
}
'프로그래밍 > C++' 카테고리의 다른 글
C++ ] CLI Loading indicator와 Progress bar (0) | 2024.10.28 |
---|---|
C++ ] 가변 인자 템플릿(Variadic Templates) 활용 (0) | 2024.09.02 |
C++ ] 문자열 탐색 및 조작 함수, find() 외 (0) | 2024.06.11 |
C++ ] std::condition_variable 사용법 (0) | 2024.05.12 |
C++ ] std::unique_lock과 std::lock_guard의 차이 (0) | 2024.05.04 |