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 > オブジェクト e を引数 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
は以下のように決定される:
- 長さ r * k の仮想的な配列オブジェクト a を作成する。
- 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
に設定する。
4)
コピーコンストラクタ。構築時には、
*
this
==
other
が
true
となります。
目次 |
パラメータ
| value | - | 内部状態の初期化に使用するシード値 |
| seq | - | 内部状態の初期化に使用するシードシーケンス |
計算量
3)
seq.generate
呼び出しの複雑度と同じ。
4)
O(r)
.
例外
例
|
このセクションは不完全です
理由: オーバーロード (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 | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| 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) |