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 > オブジェクト e を引数 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. 長さ r * k の仮想的な配列オブジェクト a を作成する。
  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 適用対象 公開時の動作 正しい動作
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 デフォルトコンストラクタが明示的だった 暗黙的になった

関連項目

エンジンの現在の状態を設定する
(public member function)