最終更新日時: 2025年10月23日 01時15分43秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<random>

# std::discrete_distribution::コンストラクタ(C++11)

    discrete_distribution();                                          // (1)

    template <class InputIterator>
    discrete_distribution(InputIterator firstW, InputIterator lastW); // (2)

    discrete_distribution(initializer_list<double> wl);               // (3)

    template <class UnaryOperation>
    discrete_distribution(size_t nw,
                          double xmin,
                          double xmax, UnaryOperation fw);            // (4)

    explicit discrete_distribution(const param_type& parm);           // (5)

## 概要

- (1) : デフォルトコンストラクタ。確率列の要素数を1、0番目の確率を1で初期化する。
  - このコンストラクタで構築された場合、乱数生成は常に0を返す。
- (2) : 確率列の範囲を受け取るコンストラクタ。受け取った範囲を、乱数生成のパラメータとして保持する。
  - `firstW == lastW`の場合(要素数0の場合)、確率列の要素数1、0番目の確率を1で初期化し、乱数生成が常に0を返すようになる。
- (3) : 確率列の初期化子リストを受け取るコンストラクタ。受け取ったリストの範囲を、乱数生成のパラメータとして保持する。
  - `discrete_distribution(wl.begin(), wl.end())` と同じ効果を持つ。
- (4) : 確率値の範囲を受け取るコンストラクタ。
  - `nw`は確率列の要素数、`xmin`は最小確率、`xmax`は最大確率、`fw`は確率列それぞれのインデックスに対する確率値を求めるための単項関数オブジェクトである。`UnaryOperation`関数オブジェクトは、`double`型に変換可能な確率値を受け取り、新たな確率値を返す。
  - 以下の公式で確率列を構築する。δの値を`0 < δ = (xmax−xmin)/n`として、`k番目の確率 = fw(xmin + k・δ + δ/2)`。
  - `nw`が0だった場合、確率列の要素数を1、0番目の確率を1で初期化する。
- (5) : パラメータオブジェクトを受け取るコンストラクタ。`param_type`は、このクラスの(5)以外のコンストラクタと同じオーバーロードを持ち、それらのコンストラクタのパラメータを保持している。このコンストラクタでは、`param`オブジェクトが持っているパラメータを、このクラスのコンストラクタに転送する。

## 要件

- (2) : `InputIterator`の要素型が、double型に変換可能であること。

## 計算量

- (4) : `fw`関数オブジェクトの呼び出しが、要素数nを超えないものとする。

## 例

    #include <iostream>
    #include <random>
    #include <vector>
    #include <cstdint>

    int main()
    {
      std::random_device seed_gen;
      std::uint32_t seed = seed_gen();
      std::mt19937 engine(seed);

      // (1)
      {
        std::discrete_distribution<> dist;

        int result = dist(engine);
        std::cout << "default constructor : " << result << std::endl;
      }

      // (2)
      {
        std::vector<double> probabilities = {0.1, 0.2, 0.3};
        std::discrete_distribution<> dist(
          probabilities.begin(),
          probabilities.end()
        );

        int result = dist(engine);
        std::cout << "iterator range constructor : " << result << std::endl;
      }

      // (3)
      {
        std::discrete_distribution<> dist = {0.1, 0.2, 0.3};

        int result = dist(engine);
        std::cout << "initializer list constructor : " << result << std::endl;
      }

      // (4)
      {
        std::discrete_distribution<> dist(10, 0.1, 1.0, [](double prob) {
          std::cout << "  probability : " << prob << std::endl;
          return prob;
        });

        int result = dist(engine);
        std::cout << "min-max constructor : " << result << std::endl;
      }

      // (5)
      {
        using dist_type = std::discrete_distribution<>;

        // 初期化子リストで確率列を作成
        dist_type::param_type param = {0.1, 0.2, 0.3};
        dist_type dist(param);

        int result = dist(engine);
        std::cout << "parameter constructor : " << result << std::endl;
      }
    }

### 出力例

    default constructor : 0
    iterator range constructor : 1
    initializer list constructor : 2
      probability : 0.145
      probability : 0.235
      probability : 0.325
      probability : 0.415
      probability : 0.505
      probability : 0.595
      probability : 0.685
      probability : 0.775
      probability : 0.865
      probability : 0.955
    min-max constructor : 3
    parameter constructor : 2

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.2 ✅
- ICC: ??
- Visual C++: ??

## 参照