namespace std {
template <class UIntType, UIntType a, UIntType c, UIntType m>
class linear_congruential_engine;
using minstd_rand0 = …;
using minstd_rand = …;
}
概要
linear_congruential_engine
クラスは、線形合同法による擬似乱数生成エンジンである。
前の擬似乱数と定数a、c、mを保持し、以下の漸化式により次の擬似乱数を生成する。
$$x_{n+1}= (a \times x_n + c) \bmod m$$
テンプレートパラメータの意味は以下の通り:
a
: 乗数。m
が非 0 の場合a < m
でなければならない。c
: 増分。m
が非 0 の場合c < m
でなければならない。m
: 法。0 の場合std::numeric_limits<result_type>::max()
。
線形合同法は、以下の特徴を持つ:
- 省メモリで高速
- 周期が短い(231-1)
省メモリで高速という点から、多くの言語で、標準の乱数生成法として使用されている。
C言語から引き継いだ標準ライブラリ関数std::rand()
の乱数生成法は実装定義だが、多くの実装で線形合同法が使用されている。
しかし、メモリ使用量がそれほど問題にならないのであれば、メルセンヌ・ツイスター(mt19937
)の使用を検討した方がいいだろう。
標準にはないが、メモリ使用量が少なく、高速で、周期も長い(メルセンヌ・ツイスターほどではない)、xorshiftという乱数生成法も存在する。
メンバ関数
構築・シード
名前 | 説明 | 対応バージョン |
---|---|---|
(constructor) |
コンストラクタ | C++11 |
~linear_congruential_engine() = default; |
デストラクタ | C++11 |
seed |
シードを設定する | C++11 |
生成
名前 | 説明 | 対応バージョン |
---|---|---|
operator() |
擬似乱数を生成する | C++11 |
discard |
指定した回数だけ擬似乱数を生成し、内部状態を進める | C++11 |
静的メンバ関数
エンジンの特性
名前 | 説明 | 対応バージョン |
---|---|---|
min |
生成し得る値の最小値を取得する | C++11 |
max |
生成し得る値の最大値を取得する | C++11 |
メンバ型
型 | 説明 | 対応バージョン |
---|---|---|
result_type |
擬似乱数生成結果の符号なし整数型 UIntType 。 |
C++11 |
メンバ定数
定数 | 説明 | 対応バージョン |
---|---|---|
static constexpr result_type multiplier |
乗数a。テンプレートパラメータa 。 |
C++11 |
static constexpr result_type increment |
増分c。状態シーケンスの要素数。テンプレートパラメータc 。 |
C++11 |
static constexpr result_type modulus |
法m。テンプレートパラメータm 。 |
C++11 |
static constexpr result_type default_seed |
デフォルトのシード値。1u |
C++11 |
非メンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
operator== |
等値比較 | C++11 |
operator!= |
非等値比較 | C++11 |
operator<< |
ストリームへの出力 | C++11 |
operator>> |
ストリームからの入力 | C++11 |
例
#include <iostream>
#include <random>
int main()
{
std::random_device seed_gen;
// linear_congruential_engineのパラメータ設定済み別名であるminstd_randを使用する。
// ランダムなシードを使用して初期化
std::minstd_rand engine(seed_gen());
for (int i = 0; i < 10; ++i) {
// 乱数を生成
std::uint32_t result = engine();
std::cout << result << std::endl;
}
}
出力
822915164
932862885
1787211539
1775131785
641394788
496072749
1485002929
1719732546
81869534
554365234
バージョン
言語
- C++11
処理系
- Clang:
- GCC: 4.7.2 ✅
- ICC:
- Visual C++: