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. 使用参数 value == 0u ? default_seed : static_cast (value % 2147483563u) 构造 std:: linear_congruential_engine < std:: uint_least32_t , 40014u, 0u, 2147483563u > 对象 e
  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++标准。

缺陷报告 应用于 发布时的行为 正确行为
LWG 2181 C++11 重载 ( 3 ) 即使 seq.generate 调用抛出异常也不会抛出 传播该异常
LWG 3809 C++11 result_type std::uint16_t 则无法构造 e 此情况下可构造
LWG 4014 C++11 LWG 3809 的解决方案导致中间
std::linear_congruential_engine
的初始种子类型与引擎的 result_type 不同
截断并
转换 value
P0935R0 C++11 默认构造函数为显式 改为隐式

参阅

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