- random[meta header]
- std[meta namespace]
- class template[meta id-type]
- cpp11[meta cpp]
namespace std {
template<class Engine, size_t K>
class shuffle_order_engine;
using knuth_b = …;
}
shuffle_order_engine
クラスは、乱数生成エンジンが生成する乱数を調整し、バッファリングされた乱数列からランダムに値を選択する生成器アダプタである。
テンプレートパラメータK
は、バッファリングする乱数列のサイズである。
このアルゴリズムは、以下のような動作を行う:
- 元となる乱数生成器で、
K
個の乱数を生成し、バッファリングする。
- 元となる乱数生成器を
e
、最後に選択した乱数をY
とした場合、式i = K * (Y - e.min()) / (e.max() - e.min() + 1)
によって、選択位置i
を決定する。
- バッファリングされた乱数列を
v
とした場合、Y = v[i]
とし、乱数列のi
番目を選択する。
- 式
v[i] = e()
で、使用済みの乱数を、新たな乱数で置き換える。
Y
を生成した乱数として返す。
この生成器アダプタは、標準内においてはlinear_congruential_engine
クラスと組み合わせて、KnuthのリオーダーアルゴリズムB(knuth_b
)の実装に使用されている。
K > 0
であること。
名前 |
説明 |
対応バージョン |
(constructor) |
コンストラクタ |
C++11 |
~shuffle_order_engine() = default; |
デストラクタ |
C++11 |
seed |
シードを設定する |
C++11 |
名前 |
説明 |
対応バージョン |
base |
元となる乱数生成器を取得する |
C++11 |
名前 |
説明 |
対応バージョン |
min |
生成し得る値の最小値を取得する |
C++11 |
max |
生成し得る値の最大値を取得する |
C++11 |
型 |
説明 |
対応バージョン |
result_type |
擬似乱数生成結果型 typename Engine::result_type 。 |
C++11 |
定数 |
説明 |
対応バージョン |
static constexpr size_t table_size |
バッファリングする乱数列の要素数。テンプレートパラメータK 。 |
C++11 |
#include <iostream>
#include <random>
int main()
{
// 線形合同法で普通に乱数を生成する
{
std::minstd_rand0 base_engine;
for (int i = 0; i < 10; ++i) {
std::cout << base_engine() << std::endl;
}
}
// shuffle_order_engineを通して線形合同法で乱数を生成する
// バッファサイズ5
std::cout << std::endl;
{
std::shuffle_order_engine<std::minstd_rand0, 5> engine;
for (int i = 0; i < 10; ++i) {
std::cout << engine() << std::endl;
}
}
}
- std::shuffle_order_engine[color ff0000]
- std::minstd_rand0[link minstd_rand0.md]
- base_engine()[link linear_congruential_engine/op_call.md]
- engine()[link shuffle_order_engine/op_call.md]
16807
282475249
1622650073
984943658
1144108930
470211272
101027544
1457850878
1458777923
2007237709
282475249
16807
1457850878
984943658
1622650073
2007237709
1144108930
823564440
101027544
1458777923
出力結果から、線形合同法が生成する順番が適度に入れ替えられ、乱雑さが増加していることがわかる。