random_subtract_with_carry_engine

random_subtract_with_carry_engine (차입 뺄셈 엔진)

std::subtract_with_carry_engine은 차입 뺄셈(subtract with carry) 알고리즘을 사용하는 난수 엔진이에요. C++11부터 사용할 수 있어요.

출처: cppreference

본문

<random> 헤더에 정의되어 있고, 시그니처는 다음과 같아요.

template<
    class UIntType,
    std::size_t w, std::size_t s, std::size_t r
> class subtract_with_carry_engine;

(since C++11)

차입 뺄셈(subtract with carry) 알고리즘을 사용하는 난수 엔진이에요.

템플릿 매개변수 (Template parameters)

  • UIntType — 결과 타입. unsigned short, unsigned int, unsigned long, unsigned long long 중 하나가 아니면 효과는 정의되지 않아요.
  • w — 상태 시퀀스의 비트 단위 단어 크기
  • s — 짧은 지연(short lag)
  • r — 긴 지연(long lag)

w가 [1, std::numeric_limits::digits]에 없거나 s가 [1, r)에 없으면 프로그램은 ill-formed예요.

생성기 속성 (Generator properties)

subtract_with_carry_engine의 상태 크기는 O(r)이고, 각 상태는 두 부분으로 구성돼요:

  • [0, 2^w)의 r개 정수 값으로 된 시퀀스 X.
  • 값이 0 또는 1인 정수 c (캐리(carry)라고 알려짐).

Xⱼ가 X의 j mod r번째 값(0부터 시작)을 나타낸다고 할 때, subtract_with_carry_engine의 전이 알고리즘 TA(xᵢ)는 다음과 같이 정의돼요:

  • X'ⱼ = Xⱼ₋ₛ - Xⱼ₋ᵣ - c로 하고, 만약 Xⱼ₋ₛ < Xⱼ₋ᵣ + c이면 캐리를 1로 설정하고 X'ⱼ에 2^w를 더해요. 그 외에는 캐리를 0으로 설정해요. (자세한 알고리즘은 원문 참고)

멤버 함수 (Member functions)

  • (constructor) — 엔진 생성
  • seed — 상태 설정
  • 생성: operator() — 다음 난수 생성; discard — 상태 진행
  • 특성: min [static] — 가장 작은 생성 값; max [static] — 가장 큰 생성 값

미리 정의된 생성기 (Predefined)

std::ranlux24_basestd::ranlux48_base가 이 엔진의 파라미터화된 인스턴스예요.

더 알아보기 (Learn more)

cppreference