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

来自cppreference.com
 
 
 
 
 
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. 以实参 value == 0u ? default_seed : value 构造 std::linear_congruential_engine<std::uint_least32_t, 40014u, 0u, 2147483563u> 类型对象 e
  2. nstd::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
    ·232j
    ) mod m
如果 X
-1
0,那么将初始状态中的进位值 c 设为 1。否则将 c 设为 0
3) 以种子序列 seq 构造引擎。给定 std::size_t(w / 32) + 1k,引擎的初始状态中的序列 X 通过以下方式确定:
  1. 创建一个长度是 r * k 的虚设数组对象。
  2. 调用 seq.generate(a + 0, a + r * k)
  3. 对于 [-r-1] 中的每个整数 i,将 X
    i
    设为 (∑k-1
    j=0
    a
    k(i+r)+j
    ·232j
    ) mod m
如果 X
-1
0,那么将初始状态中的进位值 c 设为 1。否则将 c 设为 0
此重载只有在 SeedSeq 满足种子序列 (SeedSequence) 的要求时才会参与重载决议。
4) 复制构造函数。构造完成时 *this == othertrue

参数

value - 用于内部状态初始化的种子值
seq - 用于内部状态初始化的种子序列

复杂度

1,2)e 进行 (std::size_t(w / 32) + 1) * r 次调用。
3)seq.generate 调用的复杂度相同。
4) O(r)

示例

#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 3809 C++11 result_typestd::uint16_t 时无法构造 e 此时可以构造 e
P0935R0 C++11 默认构造函数是显式的 改成隐式的

参阅

(C++11)
设置引擎的当前状态
(公开成员函数)