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

履歴 編集

class template
<random>

# std::piecewise_linear_distribution(C++11)

    namespace std {
      template <class RealType = double>
      class piecewise_linear_distribution;
    }

## 概要

`piecewise_linear_distribution`は、区間ごとの重み付けを線形に接続した分布を生成するクラスである。
このクラスはコンストラクタに、値の区間を表す数列と、区間ごとに線形に変化する重みの数列を設定する。

パラメータを、区間 `{0.0, 1.0, 2.0}`、重み `{0.0, 0.5, 0.0}`のように設定した場合、区間`[0.0, 1.0)`の値が出現する確率は、重み数列によって`[0.0, 0.5)`に線形に上昇する。区間`[1.0, 2.0)`の値が出現する確率は、重み数列によって`[0.5, 0.0)`に線形に減少する。

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

- `RealType` : 生成される実数の型。

## メンバ関数

### 構築・リセット

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

### 生成

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

### プロパティ

名前 | 説明 | 対応バージョン
--- | --- | ---
`intervals` | 区間の数列を取得する | C++11
`densities` | 重み付けの数列を取得する | C++11
`param` | 分布のパラメータを取得／設定する | C++11
`min` | 下限を取得する | C++11
`max` | 上限を取得する | C++11

## メンバ型

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

## 例

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

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

      // [0.0, 5.0)の値は、出現確率が0.0から0.5まで線形に上昇する。
      // [5.0, 10.0)の値は、出現確率が0.5から0.1まで線形に減少する。
      std::array<double, 3>
        intervals = {0.0, 5.0, 10.0},
        densities = {0.0, 0.5,  0.1};

      std::piecewise_linear_distribution<> dist(
        intervals.begin(),
        intervals.end(),
        densities.begin()
      );

      std::ofstream file("piecewise_linear_distribution.tsv");
      for (int i = 0; i < 1000; ++i) {
        double result = dist(engine);
        file << result << "\n";
      }
    }

### 出力

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

## バージョン

### 言語

- C++11

### 処理系

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