728x90
반응형
- 낮은 난수 품질
std::random_shuffle
은 내부적으로rand()
를 사용할 수 있어 난수 품질이 낮고, 일관된 시드 관리도 어렵습니다.
- 명시적 난수 엔진 전달 불가
- 난수 생성 방식을 개발자가 직접 제어하기 어렵습니다.
- 보다 안전한 대안 등장
C++11
이후std::shuffle
이 등장하면서, 개발자가 고품질 난수 엔진 (std::mt19937
등)을 직접 지정 해 줄 수 있게 되어, 재현성과 안정성이 크게 향상되었습니다.
- 표준화 방향
- 표준 위원회는 안전하고 예측 가능한 코드 작성을 위해
std::random_shuffle
을C++14
에서deprecated
,C++17
에서 완전 삭제,C++20
에서는 제거했습니다.
- 표준 위원회는 안전하고 예측 가능한 코드 작성을 위해
-
cpp
#include <iostream> #include <vector> #include <algorithm> #include <cstdlib> #include <ctime> int main() { // 랜덤 시드(random seed) 설정 std::srand(unsigned(std::time(0))); // std::time(0)는 현재 시간이며, 랜덤 시드 값으로 사용됨 // std::srand()는 단순한 선형 합동 생성기(LCG)를 기반 std::vector<int> v {1, 2, 3, 4, 5}; // std::random_shuffle 사용 (C++98) // 주어진 범위의 요소들을 무작위로 섞는 기능을 제공 std::random_shuffle(v.begin(), v.end()); for (int n : v) std::cout << n << " "; std::cout << std::endl; return 0; }
std::random_shuffle
은 내부적으로rand()
기반으로 동작합니다.
-
cpp
#include <iostream> #include <vector> #include <algorithm> #include <random> int main() { std::vector<int> v {1, 2, 3, 4, 5}; // 난수 생성 장치 (C++11) // 하드웨어 기반 난수 발생기(Hardware RNG)가 지원되는 경우 해당 장치를 사용 // 그렇지 않으면 구현 종속적인 의사난수를 생성하는 장치 std::random_device rd; // 메르센 트위스터(Mersenne Twister) 난수 생성기 엔진 (C++11) // 19937은 주기(period)가 2^19937 − 1 라는 의미 std::mt19937 g(rd()); // std::shuffle 사용 (C++11) // 주어진 범위의 요소들을 무작위로 섞는 기능을 제공 std::shuffle(v.begin(), v.end(), g); for (int n : v) std::cout << n << " "; std::cout << std::endl; return 0; }
std::shuffle
은 명확한 난수 엔진을 전달받아 보다 안전하고 예측 가능한 결과를 제공합니다.
-
엔진 이름 설명 품질 및 특징 std::minstd_rand0 가장 기본적인 LCG(선형 합동 생성기). 매우 단순하고 주기가 짧음. 매우 낮음 std::minstd_rand minstd_rand0
보다 약간 더 나은 계수를 사용하지만 여전히 LCG 방식.낮음 std::ranlux24_base 기본 RANLUX 생성기, 품질은 좋지만 속도가 느림. 중간 이하 std::ranlux48_base 48비트 버전의 RANLUX 기본 엔진. ranlux24_base
보다 더 나음.중간 std::mt19937 메르센 트위스터 32비트 버전. 긴 주기와 좋은 품질을 가짐. 중상 std::mt19937_64 메르센 트위스터 64비트 버전. 더 큰 정밀도와 품질을 제공함. 중상~높음 std::ranlux24 RANLUX 알고리즘 최적화 버전. 고품질 난수 생성기. 높음 std::ranlux48 매우 고품질의 RANLUX 난수 생성기. 신뢰성과 품질이 최고 수준. 매우 높음 std::random_device 하드웨어 엔트로피 기반 난수. 예측 불가능하며 품질이 가장 높음 (단, 느리거나 시스템 의존적일 수 있음). 최고 수준
-
엔진 이름 설명 속도 및 특성 std::minstd_rand0 매우 단순한 LCG, 가장 빠르지만 품질은 낮음. 매우 빠름 std::minstd_rand 단순 LCG, 빠르고 약간 더 안정적임. 매우 빠름 std::mt19937 메르센 트위스터 32비트 버전, 상당히 빠르고 고품질. 빠름 std::mt19937_64 64비트 메르센 트위스터, 속도는 약간 느리지만 여전히 충분히 빠름. 빠름~보통 std::ranlux24_base RANLUX의 기본형, 상대적으로 느림. 느림 std::ranlux48_base 더 높은 정밀도의 RANLUX 기본형, 더 느림. 느림 std::ranlux24 고품질 RANLUX, 매우 느리지만 안정적임. 매우 느림 std::ranlux48 RANLUX 고급형, 최고 품질이지만 속도가 가장 느림. 매우 느림 std::random_device 하드웨어 또는 OS 엔트로피 기반, 매우 느리고 블로킹 가능성도 있음. 매우 느림 (불규칙)
- 도움이 되셨으면 하단의 ❤️ 공감 버튼 부탁 드립니다. 감사합니다! 😄
728x90
반응형
'C C++' 카테고리의 다른 글
C++20에서 std::allocator<void>가 제거된 이유 (0) | 2025.03.24 |
---|---|
C++20에서 std::iterator가 삭제된 이유 (0) | 2025.03.24 |
C++17에서 std::unary_function 및 std::binary_function 가 제거된 이유 (0) | 2025.03.24 |
C++17에서 std::mem_fun과 std::mem_fun_ref가 제거된 이유 (0) | 2025.03.23 |
C++17에서 std::ptr_fun이 삭제된 이유 (0) | 2025.03.23 |