random — 의사 난수 생성
random — 의사 난수 생성 (Pseudo-random number generation)
난수 라이브러리는 난수 및 의사 난수를 생성하는 클래스들을 제공해요. <random> 헤더에 있어요.
이 클래스들은 다음과 같아요.
- 균등 난수 비트 생성기(URBG, Uniform Random Bit Generator) — 균등 분포를 가진 정수 시퀀스를 생성하는 의사 난수 생성 엔진(random number engine), 그리고 (가능하면) 진짜 난수 생성기(true random number generator)를 포함.
- 난수 분포(random number distribution) — 생성된 비트를 특정 통계 분포로 변환.
출처: cppreference
본문
기본 구조
난수 생성은 엔진(engine) + 분포(distribution) 두 단계로 이뤄져요.
#include <random>
// 1. 엔진 (난수 비트 소스)
std::mt19937 gen(std::random_device{}()); // 메르센 트위스터 + 시드
// 2. 분포 (비트를 원하는 분포로)
std::uniform_int_distribution<int> die(1, 6);
int roll = die(gen); // 1~6 균등
주요 엔진 (Engines)
| 엔진 | 설명 |
|---|---|
std::mt19937 |
메르센 트위스터 (가장 흔함) |
std::minstd_rand |
선형 합동 생성기 |
std::ranlux24 |
란소-Luxury |
std::random_device |
진짜 난수 (시드 소스로) |
주요 분포 (Distributions)
| 분포 | 설명 |
|---|---|
uniform_int_distribution |
정수 균등 |
uniform_real_distribution |
실수 균등 |
normal_distribution |
정규 분포 |
bernoulli_distribution |
베르누이 (참/거짓) |
poisson_distribution |
포아송 |
shuffle_order_engine 등 |
엔진 어댑터 |
std::normal_distribution<double> norm(0.0, 1.0); // 평균 0, 표준편차 1
double x = norm(gen);
std::bernoulli_distribution coin(0.5); // 동전 던지기
bool heads = coin(gen);
시드 (Seeding)
// random_device는 하드웨어 엔트로피 기반 진짜 난수
std::random_device rd;
std::mt19937 gen(rd()); // 시드로 사용
// 재현 가능한 시퀀스를 원하면 고정 시드
std::mt19937 fixed_gen(42);
특징
std::rand/std::srand보다 품질이 높고, 분포가 정확해요.- 암호학적으로 안전하지 않아요 (
std::random_device제외 가능). 암호용은<openssl/rand>나 전용 라이브러리를 써요. - 엔진은 복사·재현 가능해 테스트에 유용해요.
// 셔플
std::vector<int> v{1,2,3,4,5};
std::shuffle(v.begin(), v.end(), gen);
<random>은 게임·시뮬레이션·통계·샘플링 등에서 안전하고 품질 좋은 난수가 필요한 모든 곳의 표준 선택이에요.