티스토리 뷰

개발/C,C++

rand() 함수 정리

-=HaeJuK=- 2025. 1. 8. 19:04
728x90
RAND 정리

RAND 정리

1. RAND 설명

RAND는 난수를 생성하는 함수 또는 메커니즘으로, 소프트웨어 및 하드웨어에서 사용됩니다.

목적: 난수는 보안, 시뮬레이션, 게임, 통계적 분석 등 다양한 분야에서 필요합니다.

특징: 난수는 예측할 수 없어야 하며, 진정한 난수(TRNG)와 의사 난수(PRNG)로 나뉩니다.

2. RAND 함수 종류 설명 (C++)

  • std::rand (C 표준 라이브러리)
  • std::random_device (C++11 이후)
  • std::mt19937 (Mersenne Twister, C++11 이후)
  • std::uniform_int_distribution (C++11 이후)
  • RDRAND (Intel 하드웨어 명령어)
  • RDSEED (Intel, AMD 하드웨어 명령어)

3. RAND 함수별 C++ 예제

#include <iostream>
#include <random>
#include <array>
#include <immintrin.h>  // for RDRAND, RDSEED (Intel/AMD)

void rand_example() {
    // C 표준 rand
    std::cout << "C rand: " << std::rand() << std::endl;

    // C++11 random_device
    std::random_device rd;
    std::cout << "random_device: " << rd() << std::endl;

    // C++11 mt19937
    std::mt19937 mt(rd());
    std::cout << "mt19937: " << mt() << std::endl;

    // uniform_int_distribution
    std::uniform_int_distribution<int> dist(1, 100);
    std::cout << "uniform_int_distribution: " << dist(mt) << std::endl;

    // RDRAND (Intel, AMD)
    unsigned int val;
    if (_rdrand32_step(&val)) {
        std::cout << "RDRAND: " << val << std::endl;
    } else {
        std::cout << "RDRAND failed" << std::endl;
    }

    // RDSEED
    if (_rdseed32_step(&val)) {
        std::cout << "RDSEED: " << val << std::endl;
    } else {
        std::cout << "RDSEED failed" << std::endl;
    }
}

4. RAND 함수 버퍼 사용 여부 표

함수 이름 버퍼 사용 여부 설명
std::rand 간단한 의사 난수 생성기
std::random_device 하드웨어 기반 난수 생성기
std::mt19937 메르센 트위스터
std::uniform_int_distribution 특정 범위의 난수
RDRAND 하드웨어 기반 (버퍼 사용)
RDSEED 하드웨어 기반 (버퍼 사용)

5. 버퍼 사용 vs 미사용 함수 예제

#include <iostream>
#include <random>
#include <immintrin.h>  // for RDRAND, RDSEED (Intel/AMD)

// 버퍼 사용 RDRAND 예제
void buffered_random() {
    unsigned int buffer[10];
    for (int i = 0; i < 10; ++i) {
        while (!_rdrand32_step(&buffer[i]));
        std::cout << "RDRAND (Buffered): " << buffer[i] << std::endl;
    }
}

// 비버퍼 rand 예제
void non_buffered_random() {
    std::cout << "C rand: " << std::rand() << std::endl;
}

6. INTEL, AMD 하드웨어 RAND 함수

RDRAND (Intel, AMD): CPU가 직접 난수를 생성하는 명령어. AES-NI를 사용해 난수를 생성합니다.

RDSEED (Intel, AMD): 난수 시드(seed)를 생성하는 명령어로, RDRAND보다 안전하고 복잡한 난수를 제공합니다.

사용법
_rdrand32_step: 32비트 난수를 생성합니다.
_rdseed32_step: 32비트 난수 시드를 생성합니다.

#include <iostream>
#include <immintrin.h>  // for Intel/AMD hardware RNG

void rdrand_example() {
    unsigned int val;
    if (_rdrand32_step(&val)) {
        std::cout << "RDRAND: " << val << std::endl;
    } else {
        std::cout << "RDRAND failed" << std::endl;
    }
}

void rdseed_example() {
    unsigned int val;
    if (_rdseed32_step(&val)) {
        std::cout << "RDSEED: " << val << std::endl;
    } else {
        std::cout << "RDSEED failed" << std::endl;
    }
}

7. 버퍼 vs 언버퍼 비교 표

항목 버퍼 사용 (Buffered) 비버퍼 (Unbuffered)
예시 RDRAND, RDSEED std::rand, std::mt19937
난수 생성 속도 빠름 (배치로 생성) 느림 (개별 호출)
복잡성 높음 낮음
사용 예 대량 데이터 처리 간단한 작업
보안성 높음 상대적으로 낮음

8. 소프트웨어 vs 하드웨어 비교 표

항목 소프트웨어 (Software) 하드웨어 (Hardware)
예시 std::rand, std::mt19937 RDRAND, RDSEED
난수 품질 보통 높음
속도 보통 빠름
복잡성 낮음 높음
보안성 낮음 높음
사용 환경 일반 애플리케이션 암호화, 보안 애플리케이션
728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
반응형