std::subtract_with_carry_engine<UIntType,w,s,r>::subtract_with_carry_engine
来自cppreference.com
< 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 通过以下方式确定:
- 以实参 value == 0u ? default_seed : static_cast<std::uint_least32_t>(value % 2147483563u) 构造 std::linear_congruential_engine<std::uint_least32_t, 40014u, 0u, 2147483563u> 类型对象 e。
- 设 n 为 std::size_t(w / 32) + 1。
- 按顺序设置值 X-r,...,X-1。按以下方式设置每个值 Xi:
- 对 e 连续调用 n 次,以 z0 ... zn-1 表示这些调用的返回值。
- 将 Xi 设为 (∑n-1
j=0 zj·232j
) mod m。
如果 X-1 是 0,那么将初始状态中的进位值 c 设为 1。否则将 c 设为 0。
3) 以种子序列 seq 构造引擎。给定 std::size_t(w / 32) + 1 为 k,引擎的初始状态中的序列 X 通过以下方式确定:
- 创建一个长度是 r * k 的虚设数组对象。
- 调用 seq.generate(a + 0, a + r * k)。
- 对于
[
-r,
-1]
中的每个整数 i,将 Xi 设为 (∑k-1
j=0 ak(i+r)+j·232j
) mod m。
如果 X-1 是 0,那么将初始状态中的进位值 c 设为 1。否则将 c 设为 0。
此重载只有在
SeedSeq
满足种子序列 (SeedSequence) 的要求时才会参与重载决议。4) 复制构造函数。构造完成时 *this == other 是 true。
参数
value | - | 用于内部状态初始化的种子值 |
seq | - | 用于内部状态初始化的种子序列 |
复杂度
3) 与
seq.generate
调用的复杂度相同。4)O(r)。
异常
示例
本节未完成 原因:demos for overloads (2-4) required |
运行此代码
#include <cassert> #include <random> int main() { std::ranlux24_base gen24; // 重载 (1) std::ranlux48_base gen48; // 重载 (1) gen24.discard(10000 - 1); gen48.discard(10000 - 1); assert(gen24() == 7'937'952); assert(gen48() == 61'839'128'582'725); }
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2181 | C++11 | 即使 seq.generate 调用抛出了异常,重载 (3) 也不会抛出异常 | 会传播该异常 |
LWG 3809 | C++11 | 在 result_type 是 std::uint16_t 时无法构造 e | 此时可以构造 e |
LWG 4014 | C++11 | LWG 问题 3809 的解决方案导致中间 std::linear_congruential_engine 的初始种子具有与引擎的 result_type 不同的类型 | 截短并转换 value |
P0935R0 | C++11 | 默认构造函数是显式的 | 改成隐式的 |
参阅
设置引擎的当前状态 (公开成员函数) |