最終更新日時:
が更新

履歴 編集

class template
<random>

std::linear_congruential_engine(C++11)

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

処理系