最終更新日時(UTC):
が更新

履歴 編集

class template
<random>

std::subtract_with_carry_engine(C++11)

namespace std {
  template <class UIntType, size_t w, size_t s, size_t r>
  class subtract_with_carry_engine;

  using ranlux24_base = ;
  using ranlux48_base = ;
  using ranlux24      = ;
  using ranlux48      = ;
}

概要

subtract_with_carry_engineクラスは、キャリー付き減算法による擬似乱数生成エンジンである。

テンプレートパラメータの意味は以下の通り:

  • UIntType: 生成する符号なし整数の型。
  • w: ワードサイズ。0 < w <=std::numeric_limits<UIntType>::digits でなければならない。
  • s: 短いラグ。0 < s < r でなければならない。
  • r: 長いラグ。

キャリー付き減算法は、以下の特徴を持つ:

この生成法は、RANLUX (LUXury RANdom numbers) 法の実装にも使われる。

メンバ関数

構築・シード

名前 説明 対応バージョン
(constructor) コンストラクタ C++11
~subtract_with_carry_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 size_t word_size ワードサイズ。状態シーケンス内での各ワードのビット数。テンプレートパラメータw C++11
static constexpr size_t short_lag 短いラグ。進める要素数。テンプレートパラメータs C++11
static constexpr size_t long_lag 長いラグ。オペランドの値間の距離。テンプレートパラメータr C++11
static constexpr result_type default_seed デフォルトのシード値。19780503u C++11
static constexpr uint_least32_t default_seed デフォルトのシード値。19780503u C++26

非メンバ関数

名前 説明 対応バージョン
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;

  // subtract_with_carry_engineのパラメータ設定済み別名であるranlux24_baseを使用する。
  // ランダムなシードを使用して初期化
  std::ranlux24_base engine(seed_gen());

  for (int i = 0; i < 10; ++i) {
    // 乱数を生成
    std::uint32_t result = engine();

    std::cout << result << std::endl;
  }
}

出力

5880757
13095533
1545433
15249896
3512432
2193500
7368389
13589182
9374747
13701319

バージョン

言語

  • C++11

処理系

  • Clang:
  • GCC: 4.7.2
  • ICC:
  • Visual C++: 2010, 2012, 2013, 2015, 2017
    • 2008には、std::tr1::subtract_with_carryが存在する。

参照