最終更新日時: 2026年07月06日 14時24分12秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<random>

# std::poisson_distribution(C++11)

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

## 概要

`poisson_distribution`は、離散確率分布の一種であるポワソン分布を表すクラスである。
以下の確率密度関数に基いて、ランダムな整数を生成する：

$$ p(x \mid \mu) = \frac{e^{-\mu} \mu^x}{x!} $$

この数式においてμ(mu)は、平均値(mean)である。

ポワソン分布は、まれにしか起こらない事象が何回起こるかを求めるために使用できる確率分布である。以下のような用途に使用できる：

- ある交差点で1時間に起きる事故の件数
- 国道1キロメートル当たりのレストランの数
- この原稿を書いている間に変換間違えをする数

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

- `IntType` : 生成する整数型。標準の符号付き／符号なし整数型 (`signed char`、`unsigned char`を含む) 、拡張整数型 (ビット幅が`char`以上`long long`以下) 、または処理系定義のサブセットの整数型でなければならない。

## メンバ関数

### 構築・リセット

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

### 生成

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

### プロパティ

名前 | 説明 | 対応バージョン
--- | --- | ---
`mean` | 分布の平均値を取得する | C++11
`param` | 分布のパラメータを取得／設定する | C++11
`min` | 生成し得る値の下限を取得する | C++11
`max` | 生成し得る値の上限を取得する | C++11

## メンバ型

型 | 説明 | 対応バージョン
--- | --- | ---
`result_type` | 乱数生成結果の整数型 `IntType`。 | C++11
`param_type` | 分布パラメータの型。未規定。 | C++11

## 非メンバ関数

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

## 例

### 基本的な使い方

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

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

      // 平均値4.0で分布させる
      std::poisson_distribution<> dist(4.0);

      std::ofstream file("poisson_distribution.tsv");
      for (std::size_t n = 0; n < 1000; ++n) {
        // ポワソン分布で乱数を生成する
        int result = dist(engine);
        file << result << "\t\n";
      }
    }

#### 出力

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

### 地震が1ヶ月に平均1回起こるとして1年間をシミュレート

    #include <iostream>
    #include <random>

    int main() {
      // 平均的に1ヶ月に1回の地震が起こるとする
      double average_quakes = 1.0;

      std::random_device seed_gen;
      std::default_random_engine engine{seed_gen()};
      std::poisson_distribution<int> dist{average_quakes};

      // 1年間 (12ヶ月) の地震の回数をシミュレート
      for (int month = 1; month <= 12; ++month) {
        int quakes = dist(engine);
        std::cout << "Month " << month << ": " << quakes << " earthquake(s)\n";
      }
    }

#### 出力例

    Month 1: 1 earthquake(s)
    Month 2: 2 earthquake(s)
    Month 3: 2 earthquake(s)
    Month 4: 0 earthquake(s)
    Month 5: 0 earthquake(s)
    Month 6: 1 earthquake(s)
    Month 7: 1 earthquake(s)
    Month 8: 1 earthquake(s)
    Month 9: 2 earthquake(s)
    Month 10: 2 earthquake(s)
    Month 11: 2 earthquake(s)
    Month 12: 1 earthquake(s)

## バージョン

### 言語

- C++11

### 処理系

- Clang: 7 ✅
- GCC: 4.7.2 ✅
- Visual C++:

### 参考

- ポワソン分布 - Wikipedia
- ポアソン分布 - 統計・データ解析
- ポアソン分布 - NtRand
- ［データ分析］ポアソン分布 ～ 100年に1人の天才は何人現れる？：やさしい確率分布 - ＠IT

## 参照

- P4037R1 Supporting `signed char` and `unsigned char` in random number generation
  - `IntType`テンプレートパラメータに`signed char`／`unsigned char`を指定できるようになった。この仕様はC++26から導入されたが、仕様の欠陥を修正したものであるためコンパイラは早期に対応している場合がある