728x90
반응형

C++17에서 std::random_shuffle이 삭제된 이유


1. 삭제 이유

  • 낮은 난수 품질
    • std::random_shuffle은 내부적으로 rand()를 사용할 수 있어 난수 품질이 낮고, 일관된 시드 관리도 어렵습니다.
  • 명시적 난수 엔진 전달 불가
    • 난수 생성 방식을 개발자가 직접 제어하기 어렵습니다.
  • 보다 안전한 대안 등장
    • C++11 이후 std::shuffle이 등장하면서, 개발자가 고품질 난수 엔진 (std::mt19937 등)을 직접 지정 해 줄 수 있게 되어, 재현성과 안정성이 크게 향상되었습니다.
  • 표준화 방향
    • 표준 위원회는 안전하고 예측 가능한 코드 작성을 위해 std::random_shuffleC++14에서 deprecated, C++17에서 완전 삭제, C++20에서는 제거했습니다.


2. C++98 코드 예제 (std::random_shuffle)

  • 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() 기반으로 동작합니다.


3. C++20 코드 예제 (std::shuffle)

  • 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은 명확한 난수 엔진을 전달받아 보다 안전하고 예측 가능한 결과를 제공합니다.


4. 표준 랜덤 엔진

4.1. 랜덤 품질 기준 엔진

  • 엔진 이름 설명 품질 및 특징
    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 하드웨어 엔트로피 기반 난수. 예측 불가능하며 품질이 가장 높음 (단, 느리거나 시스템 의존적일 수 있음). 최고 수준

4.2. 랜덤 속도 기준 엔진

  • 엔진 이름 설명 속도 및 특성
    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
반응형

+ Recent posts