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>
#include <cstdint>
int main()
{
std::random_device seed_gen;
std::uint32_t seed = seed_gen();
// linear_congruential_engineのパラメータ設定済み別名であるminstd_randを使用する。
// ランダムなシードを使用して初期化
std::minstd_rand engine(seed);
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++: