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>은 게임·시뮬레이션·통계·샘플링 등에서 안전하고 품질 좋은 난수가 필요한 모든 곳의 표준 선택이에요.

더 알아보기 (Learn more)

cppreference