> 백엔드 개발 > C++ > 본문

새로운 무작위 라이브러리가 정말로 `std::rand()`보다 나은가요?

Susan Sarandon
풀어 주다: 2024-10-31 07:03:30
원래의
536명이 탐색했습니다.

Is the New Random Library Really Better Than `std::rand()`?

왜 새로운 무작위 라이브러리가 std::rand()보다 나은가요?

유명한 강연 "rand()는 유해한 것으로 간주됩니다"에서 엔진 배포를 사용하여 난수 생성을 위한 패러다임은 고전적인 std::rand()와 모듈러스 단순화를 통해 옹호됩니다.

제시된 주장을 테스트하기 위해 std::rand()와 std::mt19937 및 std::를 비교하는 실험이 있습니다. uniform_int_distribution이 수행되었습니다.

  1. 두 가지 방법을 사용하여 0과 5 사이의 난수를 생성하기 위해 getRandNum_Old 및 getRandNum_New라는 두 함수가 고안되었습니다.
  2. 두 가지 접근 방식을 사용하여 960,000개의 난수가 생성되었습니다. , 그리고 숫자 0~5의 빈도를 집계했습니다.
  3. 1000회의 시뮬레이션에 대해 빈도의 표준편차를 계산했습니다.
  4. 두 방법 모두에 소요된 시간도 기록했습니다.

놀랍게도 롤의 총 ​​확산은 두 방법 모두 동일했으며 이는 std::mt19937과 std::uniform_int_distribution이 추가 균일성을 제공하지 않았음을 나타냅니다. 그러나 새로운 방법은 대략 4배 더 느렸습니다.

이 실험에서는 std::rand()가 반드시 열등한 것은 아닌 것으로 나타났지만 std::rand()의 고유한 한계를 고려하는 것이 중요합니다.

  • 하위 비트의 낮은 무작위성, 짧은 주기, 제한된 RAND_MAX 등의 약점을 보이는 것으로 알려진 선형 합동 생성기(LCG)를 사용합니다.
  • srand 인터페이스는 부호 없는 정수를 사용한다는 사실 때문에 시작 시드(따라서 생성된 시퀀스)의 수를 제한합니다.

반면, 새로운 C 표준 라이브러리의 헤더:

  • 특성이 보장된 완전히 지정된 알고리즘을 제공합니다.
  • 생성기를 클래스에 캡슐화하여 전역 상태 및 관련 문제를 제거합니다.
  • 다음을 포함합니다. 시딩을 위한 기본 random_device.
  • 원하는 경우 사용자 정의 생성기 구현을 허용합니다.

성능 측면에서 std::minstd_rand가 std를 대체하는 데 적합할 수 있음을 권장합니다. ::mt19937 LCG 품질이 충분할 때 잠재적으로 더 나은 속도를 제공합니다(특히uniform_int_distribution을 사용하여 분포 조정을 피할 때).

궁극적으로 난수 생성기의 선택은 애플리케이션의 특정 요구 사항에 따라 다르지만 새로운 <랜덤> 라이브러리는 특히 고품질 난수를 요구하는 애플리케이션의 경우 레거시 std::rand() 구현에 비해 여러 가지 이점을 제공합니다.

위 내용은 새로운 무작위 라이브러리가 정말로 `std::rand()`보다 나은가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿