class template
<random>
std::shuffle_order_engine(C++11)
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 |
生成
| 名前 | 説明 | 対応バージョン |
|---|---|---|
operator() |
乱数を生成する | C++11 |
discard |
指定した回数だけ擬似乱数を生成し、内部状態を進める | 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 |
非メンバ関数
| 名前 | 説明 | 対応バージョン |
|---|---|---|
operator== |
等値比較 | C++11 |
operator!= |
非等値比較 | C++11 |
operator<< |
ストリームへの出力 | C++11 |
operator>> |
ストリームからの入力 | 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;
}
}
}
出力
16807
282475249
1622650073
984943658
1144108930
470211272
101027544
1457850878
1458777923
2007237709
282475249
16807
1457850878
984943658
1622650073
2007237709
1144108930
823564440
101027544
1458777923
出力結果から、線形合同法が生成する順番が適度に入れ替えられ、乱雑さが増加していることがわかる。
バージョン
言語
- C++11
処理系
- Clang:
- GCC: 4.7.2 ✅
- ICC:
- Visual C++: