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 > с аргументом 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. Создает фиктивный массив a длиной r * k .
  2. Вызывает seq. generate ( a + 0 , a + r * k ) .
  3. Для каждого целого числа i в [ - r , - 1 ] , устанавливает 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 Applied to Behavior as published Correct behavior
LWG 2181 C++11 перегрузка ( 3 ) не генерировала исключение, даже если вызов seq.generate генерирует исключение распространяет исключение
LWG 3809 C++11 e не мог быть сконструирован, если result_type является std::uint16_t может быть сконструирован в этом случае
LWG 4014 C++11 решение LWG issue 3809 привело к тому, что начальное значение
промежуточного std::linear_congruential_engine
имеет другой тип по сравнению с result_type движка
усекает и
преобразует value
P0935R0 C++11 конструктор по умолчанию был explicit сделан implicit

Смотрите также

устанавливает текущее состояние движка
(публичная функция-член)