> 백엔드 개발 > C++ > C의 ``라이브러리가 rand()보다 선호되는 이유는 무엇입니까?

C의 ``라이브러리가 rand()보다 선호되는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-03 17:00:03
원래의
221명이 탐색했습니다.

Why is the `` library in C   preferred over `rand()`?

왜 새로운 난수 라이브러리가 rand()보다 나은가요?

rand()에 대한 현대적인 우려로 인해 우수한 난수 활용에 대한 논의가 촉발되었습니다. 기존 std::rand() 및 모듈로 접근 방식과 달리 엔진 배포 패러다임을 기반으로 한 생성(RNG) 절차입니다. rand()의 단점을 직접 이해하기 위해 빠른 실험이 수행되었습니다.

std::rand() 및 std를 활용하여 getRandNum_Old() 및 getRandNum_New()라는 두 가지 함수가 생성되었습니다. :mt19937은 각각 std::uniform_int_distribution을 사용하여 0과 5 사이의 난수를 생성합니다. 각 방법을 사용하여 960,000개의 난수를 생성하고 각 숫자(0-5)의 빈도를 기록했습니다. 표준편차는 측정항목으로 사용되었으며, 값이 낮을수록 분포가 더 균일함을 나타냅니다. 이 과정을 1000번 반복하고, 각 반복에 걸리는 시간을 측정했습니다.

놀랍게도 두 방법 모두 롤의 분포가 비슷했습니다. 새로운 방법은 약 4배 더 느렸습니다. 최소한의 품질 향상을 대가로 속도 향상이 이루어진 것으로 나타났습니다.

그러나 결정적인 차이점은 RNG 구현 자체에 있습니다. 많은 rand() 구현에서는 일반적으로 가장 강력하지 않은 LCG(선형 합동 생성기)를 사용합니다. 널리 퍼져 있음에도 불구하고 일반적으로 수행된 것과 같은 기본 테스트에서 허용 가능한 결과를 생성합니다.

표준 이하의 rand() 구현의 단점에는 하위 비트의 낮은 무작위성, 짧은 기간, 낮은 RAND_MAX 및 연속적인 비트 간의 상관 관계가 포함됩니다. 추출. 그러나 이러한 제한 사항은 rand() API에 고유한 것이 아니라는 점에 유의하는 것이 중요합니다.

rand()의 근본적인 문제는 다음 사항에 중점을 둡니다.

  1. 하위 호환성: 기존 구현을 변경하면 고정 시드가 있는 srand에 의존하는 프로그램의 재현성이 손상됩니다.
  2. 단순한 인터페이스: rand()는 단일 전역 생성기를 제공합니다. 기본 사용 사례에는 적합하지만 멀티스레드 애플리케이션과 재현 가능한 시퀀스가 ​​필요한 시나리오에서는 문제가 됩니다.

새로운 라이브러리는 다음을 제공하여 이러한 문제를 해결합니다.

    지정된 구현
  • : 컴파일러 간 재현 가능한 출력 및 보장된 특성
  • 최첨단 생성기
  • : 전역 상태 문제를 피하기 위해 클래스에 캡슐화됩니다.
  • 임의 장치
  • : 파종 시설.
  • 성능 측면에서, std::mt19937 ( 테스트에서 std::rand()에 의해 사용됨)은 std::minstd_rand( 라이브러리에서도 사용 가능한 LCG)보다 느립니다. getRandNum_Old()와 유사한 구현으로 std::minstd_rand를 사용하면 더 빠른 실행을 달성할 수 있습니다(rand()의 8.61ms에 비해 6ms).

위 내용은 C의 ``라이브러리가 rand()보다 선호되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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