본문 바로가기
프로그래밍/C++

C++ ] <random> 헤더 사용 난수 생성

by eteo 2024. 12. 3.

 

 

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;
}