티스토리 뷰
728x90
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
링크
TAG
- Linux
- 윈도우
- 외돌개
- 제주도
- 블루버블
- OpenSource
- 패턴
- ip
- Windows
- 블루버블다이빙팀
- 스쿠버 다이빙
- 성산블루버블
- C
- C# 고급 기술
- DLL
- Build
- 스쿠버다이빙
- CMake
- C#
- 현포다이브
- Thread
- 리눅스
- C++
- 서귀포
- 서귀포블루버블
- 울릉도
- PowerShell
- C#.NET
- 블루버블다이브팀
- 암호화
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형