std::subtract_with_carry_engine<UIntType,w,s,r>:: subtract_with_carry_engine
From cppreference.net
<
cpp
|
numeric
|
random
|
subtract with carry engine
|
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
начального
состояния
генератора определяется следующим образом:
- Создает объект std:: linear_congruential_engine < std:: uint_least32_t , 40014u, 0u, 2147483563u > с аргументом value == 0u ? default_seed : static_cast < std:: uint_least32_t > ( value % 2147483563u ) .
- Пусть n будет равно std:: size_t ( w / 32 ) + 1 .
- Устанавливает значения X -r , ..., X -1 в указанном порядке. Каждое значение X i устанавливается следующим образом:
-
- Последовательно вызывает e для n раз, возвращаемые значения обозначаются как z 0 ... z n-1 .
-
Устанавливает
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
начального
состояния
движка определяется следующим образом:
- Создает фиктивный массив a длиной r * k .
- Вызывает seq. generate ( a + 0 , a + r * k ) .
-
Для каждого целого числа
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 | - | последовательность начальных значений для инициализации внутреннего состояния |
Сложность
3)
Такая же, как сложность вызова
seq.generate
.
4)
O(r)
.
Исключения
3)
Если
SeedSeq
не является
std::seed_seq
, выбрасывает исключения, выброшенные вызовом
seq.generate
.
Пример
|
Этот раздел не завершён
Причина: требуются демонстрации для перегрузок (2-4) |
Запустить этот код
#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 |
Смотрите также
|
устанавливает текущее состояние движка
(публичная функция-член) |