最終更新日時: 2026年05月18日 13時21分35秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<random>

# std::discrete_distribution(C++11)

    namespace std {
      template <class IntType = int>
      class discrete_distribution;
    }

## 概要

`discrete_distribution`は整数のインデックスごとに離散した確率分布を生成するクラスである。アルゴリズムとしては、Walkerの別名法(Walker's alias method, 二者択一法ともいう)で実装されることが多い。

この分布クラスは、コンストラクタで指定された確率列に基いて値を分布させる。その結果として、確率列から選択された、0から始まるインデックスを返す。

テンプレートパラメータは、以下を意味する。

- `IntType` : 分布結果として返される、0から始まるインデックス値の整数型。負の値が返されることはないため、符号なし整数型を指定してもよい。デフォルトは`int`。標準の符号付き／符号なし整数型 (`signed char`、`unsigned char`を含む) 、拡張整数型 (ビット幅が`char`以上`long long`以下) 、または処理系定義のサブセットの整数型でなければならない。

## メンバ関数

### 構築・リセット

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++11
`~discrete_distribution() = default;` | デストラクタ | C++11
`reset` | 状態をリセットする | C++11

### 生成

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator()` | 乱数を生成する | C++11

### プロパティ

名前 | 説明 | 対応バージョン
--- | --- | ---
`probabilities` | インデックスに対応する確率の数列を取得する | C++11
`param` | 分布のパラメータを取得／設定する | C++11
`min` | 下限を取得する | C++11
`max` | 上限を取得する | C++11

## メンバ型

型 | 説明 | 対応バージョン
--- | --- | ---
`result_type` | 乱数生成結果の型 `IntType`。0から始まるインデックス値が入る整数型である。符号なし整数型でもよい。 | C++11
`param_type` | 分布パラメータの型。未規定。 | C++11

## 非メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較 | C++11
`operator!=` | 非等値比較 | C++11
`operator<<` | ストリームへの出力 | C++11
`operator>>` | ストリームからの入力 | C++11

## 例

    #include <random>
    #include <vector>
    #include <fstream>
    #include <cstdint>

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

      // 確率列を定義
      // 浮動小数点数の範囲として定義する。合計値が1.0や10.0のような切りの良い数値である必要はない。
      std::vector<double> probabilities = {
        0.0, 0.1, 0.2,
        0.3, 0.4, 0.5,
        1.0, 0.9, 0.8,
        0.7, 0.6
      };

      // 分布オブジェクトを生成。
      // コンストラクタには、確率列のイテレータ範囲を指定する。
      std::discrete_distribution<std::size_t> dist(
        probabilities.begin(),
        probabilities.end()
      );

      std::ofstream result_file("discrete_distribution.tsv");
      for (std::size_t n = 0; n < 1000; ++n) {
        // 確率列に基いて、ランダムなインデックスを生成する。
        // 確率0.1のものが選択された場合は1が返され、
        // 確率0.6が選択された場合は10が返される。
        std::size_t result = dist(engine);

        result_file << result << "\t\n";
      }
    }

### 出力

このプログラムによってある時に得られた結果（;discrete_distribution.tsv.7z）を図示する。

## バージョン

### 言語

- C++11

### 処理系

- Clang:
- GCC: 4.5.3 ✅
- ICC:
- Visual C++:

## 参照

- 離散確率分布 - Wikipedia
- Pseudo-random number sampling - Wikipedia
- Alias Method - Wikipedia
- 一般の離散分布の従う乱数の発生させる方法 - arupaka-_-arupakaの日記
- P4037R1 Supporting `signed char` and `unsigned char` in random number generation
  - `IntType`テンプレートパラメータに`signed char`／`unsigned char`を指定できるようになった。この仕様はC++26から導入されたが、仕様の欠陥を修正したものであるためコンパイラは早期に対応している場合がある