Namespaces
Variants

std::subtract_with_carry_engine<UIntType,w,s,r>:: subtract_with_carry_engine

From cppreference.net
subtract_with_carry_engine ( ) : subtract_with_carry_engine ( 0u ) { }
(1) (C++11부터)
explicit subtract_with_carry_engine ( result_type value ) ;
(2) (C++11부터)
template < class SeedSeq >
explicit subtract_with_carry_engine ( SeedSeq & seq ) ;
(3) (C++11부터)
subtract_with_carry_engine ( const subtract_with_carry_engine & other ) ;
(4) (C++11부터)
(암시적으로 선언됨)

의사 난수 엔진을 생성합니다.

1) 기본 생성자.
  • 기본 생성된 엔진이 std::ranlux24_base 타입인 경우, 이를 10000회 연속 호출했을 때 생성되는 값은 7937952 입니다.
  • 기본 생성된 엔진이 std::ranlux48_base 타입인 경우, 이를 10000회 연속 호출했을 때 생성되는 값은 61839128582725 입니다.
2) 엔진을 시드 값 value 로 생성합니다. 엔진의 초기 상태 의 시퀀스 X 는 다음과 같이 결정됩니다:
  1. 다음 인수를 사용하여 std:: linear_congruential_engine < std:: uint_least32_t , 40014u, 0u, 2147483563u > 객체 e 를 생성합니다: value == 0u ? default_seed : static_cast < std:: uint_least32_t > ( value % 2147483563u ) .
  2. n std:: size_t ( w / 32 ) + 1 으로 설정합니다.
  3. X -r , ..., X -1 의 값을 해당 순서대로 설정합니다. 각 값 X i 는 아래와 같이 설정됩니다:
  1. e n 회 연속적으로 호출하며, 반환값을 z 0 ... z n-1 로 표기합니다.
  2. X i (∑ n-1
    j=0
    z j ·2 32j
    ) mod m
    으로 설정합니다.
만약 X -1 0 이면, 엔진의 초기 상태 캐리 값 c 1 로 설정합니다. 그렇지 않으면, c 0 으로 설정합니다.
3) 시드 시퀀스 seq 를 사용하여 엔진을 생성합니다. std:: size_t ( w / 32 ) + 1 k 로 주어졌을 때, 엔진의 초기 상태 시퀀스 X 는 다음과 같이 결정됩니다:
  1. 길이 r * k 의 가상 배열 객체 a 를 생성합니다.
  2. seq. generate ( a + 0 , a + r * k ) 를 호출합니다.
  3. [ - r , - 1 ] 범위의 각 정수 i 에 대해 X i (∑ k-1
    j=0
    a k(i+r)+j ·2 32j
    ) mod m
    으로 설정합니다.
만약 X -1 0 이면, 엔진의 초기 상태 캐리 값 c 1 로 설정합니다. 그렇지 않으면, c 0 으로 설정합니다.
이 오버로드는 다음 조건에서만 오버로드 해결에 참여합니다: SeedSeq SeedSequence 요구 사항을 충족하는 경우에만.
4) 복사 생성자. 생성 시, * this == other true 입니다.

목차

매개변수

value - 내부 상태 초기화에 사용할 시드 값
seq - 내부 상태 초기화에 사용할 시드 시퀀스

복잡도

1,2) ( std:: size_t ( w / 32 ) + 1 ) * r 번의 e 호출.
3) seq.generate 호출의 복잡도와 동일합니다.
4) O(r) .

예외

3) 만약 SeedSeq std::seed_seq 가 아닌 경우, seq.generate 호출에서 발생하는 예외를 던집니다.

예제

#include <cassert>
#include <random>
int main()
{
    std::ranlux24_base gen24; // overload (1)
    std::ranlux48_base gen48; // overload (1)
    gen24.discard(10000 - 1);
    gen48.discard(10000 - 1);
    assert(gen24() == 7'937'952);
    assert(gen48() == 61'839'128'582'725);
}

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2181 C++11 오버로드 ( 3 ) seq.generate 호출이 예외를 발생시켜도 예외를 발생시키지 않음 예외를 전파함
LWG 3809 C++11 e result_type std::uint16_t 인 경우 생성될 수 없음 이 경우 생성 가능함
LWG 4014 C++11 LWG 이슈 3809 의 해결로 인해 중간
std::linear_congruential_engine 의 초기 시드가
엔진의 result_type 와 다른 타입을 가짐
잘라내고
value 를 변환함
P0935R0 C++11 기본 생성자가 명시적(explicit)이었음 암시적(implicit)으로 변경됨

참고 항목

엔진의 현재 상태를 설정합니다
(public member function)