C++ 난수 생성기
C++에서 난수 생성 방법을 인터랙티브 코드 예제와 함께 배워보세요. rand(), srand(), <random> library, std::uniform_int_distribution, std::mt19937을 자세히 설명해 보세요.
C++ 코드 편집기
C++에서 난수 생성 방법을 인터랙티브 코드 예제와 함께 배워보세요. rand(), srand(), <random> library, std::uniform_int_distribution, std::mt19937을 자세히 설명해 보세요.
#include <iostream>
#include <random>
int main() {
int min = 1;
int max = 100;
int quantity = 5;
// Modern C++ random number generation
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(min, max);
std::cout << "Modern C++ random numbers:" << std::endl;
for (int i = 0; i < quantity; i++) {
int num = dis(gen);
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
출력
브라우저 미리보기이며 Java나 C++를 실행하지 않습니다. 암호화 용도로 적합하지 않습니다.
예시 미리보기
rand() 사용된 클래식 C++
전통적인 rand() 함수를 사용 <cstdlib> 해 무작위 정수를 생성하세요. 간단하고 널리 지원되지만, 무작위성 품질이 낮아 암호학 응용에는 적합하지 않습니다.
빠른 랜덤 번호가 필요하신가요?
코드를 작성하지 않고도 즉각적인 결과를 얻으려면 온라인 난수 생성기를 사용해 보세요.
C++ 난수 생성 이해하기
rand()의 알고리즘은 구현에 따라 다릅니다. C++11은 std::mt19937 같은 엔진과 분포를 분리하며, 분포에 기본 mt19937 엔진이 지정되어 있지는 않습니다.
rand() Function
rand()의 알고리즘은 구현에 따라 다릅니다. C++11은 std::mt19937 같은 엔진과 분포를 분리하며, 분포에 기본 mt19937 엔진이 지정되어 있지는 않습니다.
<random> Library
<random> 이 라이브러리(C++11+)는 std::mt19937(Mersenne Twister), uniform_int_distribution 같은 다양한 분포, 그리고 rand()보다 더 나은 무작위성 품질을 가진 현대적인 난수 생성 기능을 제공합니다.
uniform_int_distribution
std::uniform_int_distribution은 균등 분포로 정수 범위에 대한 정밀한 제어를 제공합니다. 통계 응용, 시뮬레이션 및 정확한 범위 제어가 필요할 때 완벽합니다.
std::mt19937
rand()의 알고리즘은 구현에 따라 다릅니다. C++11은 std::mt19937 같은 엔진과 분포를 분리하며, 분포에 기본 mt19937 엔진이 지정되어 있지는 않습니다.
일반적인 사용 사례
게임 및 시뮬레이션
rand() 또는 현대 라이브러리 내 루프와 시뮬레이션을 사용해 무작위 주사위 굴림, 카드 드로우, 절차적 생성, 게임 이벤트를 생성할 <random> 수 있습니다.
보안 및 암호학
rand()와 std::mt19937은 암호학적 생성기가 아닙니다. 보안 목적에는 문서로 확인된 암호 라이브러리나 운영체제 API를 사용하세요. std::random_device는 이식 가능한 보안 보장이 아닙니다.
고성능 컴퓨팅
<random> std::mt19937을 가진 현대 라이브러리는 HPC 및 과학 컴퓨팅 응용 분야에서 대량의 난수 생성에 뛰어난 성능을 제공합니다.
소프트웨어 테스트
무작위 테스트 데이터, 퍼즈 테스트 입력, 엣지 케이스를 생성하여 C++ 애플리케이션에서 견고한 코드 커버리지와 버그 탐지를 보장합니다.
C++ 난수 생성 작동 원리
rand()의 알고리즘은 구현에 따라 다릅니다. C++11은 std::mt19937 같은 엔진과 분포를 분리하며, 분포에 기본 mt19937 엔진이 지정되어 있지는 않습니다.
rand()의 알고리즘은 구현에 따라 다릅니다. C++11은 std::mt19937 같은 엔진과 분포를 분리하며, 분포에 기본 mt19937 엔진이 지정되어 있지는 않습니다.
std::random_device는 구현에 따라 결정적 엔진을 사용할 수도 있습니다. 모든 플랫폼에서 예측 불가능한 출력을 보장하지 않습니다.
실용 팁
New Code에서는 rand()를 피하세요
rand()의 알고리즘은 구현에 따라 다릅니다. C++11은 std::mt19937 같은 엔진과 분포를 분리하며, 분포에 기본 mt19937 엔진이 지정되어 있지는 않습니다.
시드를 명시적으로 선택하기
고정 시드를 사용하면 같은 엔진의 수열을 재현합니다. C++ 엔진은 시스템 엔트로피로 자동 초기화되지 않으므로 필요하면 시드를 명시하세요.
적절한 배포판 사용
균일한 정수 범위는 std::uniform_int_distribution를 사용하세요. 부동소수점 숫자는 std::uniform_real_distribution를 사용하세요. 이로 인해 적절한 통계적 성질이 보장됩니다.
기술 사양
알고리즘
- rand()의 알고리즘은 구현에 따라 다릅니다. C++11은 std::mt19937 같은 엔진과 분포를 분리하며, 분포에 기본 mt19937 엔진이 지정되어 있지는 않습니다.
- 메르센 트위스터 (std::mt19937)
- std::random_device는 구현에 따라 결정적 엔진을 사용할 수도 있습니다. 모든 플랫폼에서 예측 불가능한 출력을 보장하지 않습니다.
성능 특성
- rand(): 빠르지만 무작위성 품질은 낮습니다
- <random>: 빠르고 우수한 품질입니다
- std::mt19937: Very fast for large quantities
자주 묻는 질문
어떤 C++ 방식을 다루나요?
srand()와 함께 사용하는 고전적인 rand(), 최신 <random> 라이브러리, std::uniform_int_distribution, 그리고 mt19937 엔진입니다.
예제를 직접 조정할 수 있나요?
네. 매개변수 패널에서 최솟값, 최댓값, 개수를 설정한 후 실행하면 결과를 확인할 수 있습니다.
현재 어떤 방식이 권장되나요?
명명된 분포와 엔진을 함께 사용하는 <random> 라이브러리가 권장됩니다. rand()는 기존 코드에는 남아 있지만 품질이 낮고 범위 처리에 함정이 있습니다.
생성기는 어떻게 시드하나요?
std::random_device는 구현에 따라 결정적 엔진을 사용할 수도 있습니다. 모든 플랫폼에서 예측 불가능한 출력을 보장하지 않습니다.
C++에서 rand()는 어떤 범위의 값을 반환하나요?
rand()는 0부터 RAND_MAX까지 양 끝을 포함해 반환합니다. Microsoft CRT는 32767을 사용합니다. 다른 플랫폼도 같은 상한이라고 가정하지 마세요.
rand()는 암호학적으로 안전한가요?
rand()와 std::mt19937은 암호학적 생성기가 아닙니다. 보안 목적에는 문서로 확인된 암호 라이브러리나 운영체제 API를 사용하세요. std::random_device는 이식 가능한 보안 보장이 아닙니다.
C++에서 난수 실수(float)는 어떻게 생성하나요?
std::mt19937을 원하는 구간(예: 0.0부터 1.0)으로 설정된 std::uniform_real_distribution과 결합한 다음 dist(generator)를 호출하세요. 결과는 하한값은 포함되지만 상한값은 제외되는 double입니다.
C++에서 rand()는 스레드 안전한가요?
rand()의 스레드 안전성은 구현에 따라 다릅니다. 스레드별 엔진을 쓰거나 공유 엔진의 접근을 동기화하세요.
C++ standard draft: rand / srand · C++ standard draft: random_device · C++ standard draft: uniform_int_distribution
참고 문헌 및 리소스
-
C++ <random> Reference - cppreference
C++ 의사 난수 생성 라이브러리 공식 참고 자료입니다.
-
Mersenne Twister - Wikipedia
대부분 언어의 난수 라이브러리 기반이 되는 Mersenne Twister 알고리즘입니다.