最終更新日時: 2026年03月19日 13時15分46秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<random>

# std::uniform_real_distribution(C++11)

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

## 概要

`uniform_real_distribution`は、指定された範囲の値が等確率で発生するよう離散分布するクラスである。 このクラスは、離散一様分布(Discrete Uniform Distribution)の実数に特化したバージョンである。整数が必要な場合は、`uniform_int_distribution`クラスを使用する。

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

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

## 備考

- `uniform_real_distribution`の実装は、内部的に`std::generate_canonical()`を使用している環境がある
  - `std::generate_canonical<std::numeric_limits<RealType>::digits>(rng) * (b - a) + a`のようにして、指定された範囲`[a, b)`の値を生成する
  - C++23まではその`std::generate_canonical()`の仕様上、浮動小数点数の丸めにより指定範囲外の値（上限値`b`）が生成されることがあった
  - C++26では`std::generate_canonical()`に棄却法が導入されたことで、この問題は解消された
    - P0952R2 A New Specification for `generate_canonical`

## メンバ関数

### 構築・リセット

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

### 生成

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

### プロパティ

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

## メンバ型

型 | 説明 | 対応バージョン
--- | --- | ---
`result_type` | 乱数生成結果の実数型 `RealType`。 | 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);

      // 0.0以上1.0未満の値を等確率で発生させる
      std::uniform_real_distribution<> dist(0.0, 1.0);

      std::ofstream result_file("uniform_real_distribution.tsv");
      for (std::size_t n = 0; n < 1000; ++n) {
        // 一様実数分布で乱数を生成する
        double result = dist(engine);

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

### 出力

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

1,000個程度のデータのため、ある程度は偏りがあるが、誤差の範囲でほぼ等確率で0.0から1.0までの値が生成されていることがわかる。

## バージョン

### 言語

- C++11

### 処理系

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