最終更新日時: 2025年07月09日 00時33分39秒 (JST)
Akira Takahashi が更新

履歴 編集

concept
<random>

# std::uniform_random_bit_generator(C++20)

    namespace std {
      template<class G>
      concept uniform_random_bit_generator =
        invocable<G&> && unsigned_integral<invoke_result_t<G&>> &&
        requires {
          { G::min() } -> same_as<invoke_result_t<G&>>;
          { G::max() } -> same_as<invoke_result_t<G&>>;
          requires bool_constant<(G::min() < G::max())>::value;
        };
    }

## 概要

`uniform_random_bit_generator`は、任意の乱数生成器`G`が離散一様分布を示す（取り得る出力範囲における各値の出現確率が一定であり符号なし整数型を返す）関数オブジェクトであることを表すコンセプトである。

## モデル

型`G`のオブジェクト`g`について以下の条件を満たす場合に限って、型`G`は`uniform_random_bit_generator`のモデルである

- `G::min() <= g()`であること
- `g() <= G::max()`であること
- `g()`の時間/空間計算量は償却定数であること

## 例

    #include <iostream>
    #include <random>

    template<std::uniform_random_bit_generator G>
    void f(const char* name) {
      std::cout << name << " is uniform random bit generator" << std::endl;
    }

    template<typename G>
    void f(const char* name) {
      std::cout << name << " is not uniform random bit generator" << std::endl;
    }

    int main() {
      f<std::mt19937>("std::mt19937");
      f<std::minstd_rand>("std::minstd_rand");
      f<std::ranlux48>("std::ranlux48");
      f<std::knuth_b>("std::knuth_b");
      f<std::random_device>("std::random_device");

      std::cout << "\n";
      f<std::uniform_real_distribution<>>("std::uniform_real_distribution<>");
      f<std::normal_distribution<>>("std::normal_distribution<>");
      f<std::exponential_distribution<>>("std::exponential_distribution<>");
    }

### 出力

    std::mt19937 is uniform random bit generator
    std::minstd_rand is uniform random bit generator
    std::ranlux48 is uniform random bit generator
    std::knuth_b is uniform random bit generator
    std::random_device is uniform random bit generator

    std::uniform_real_distribution<> is not uniform random bit generator
    std::normal_distribution<> is not uniform random bit generator
    std::exponential_distribution<> is not uniform random bit generator

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 3 ✅

## 関連項目

- C++20 コンセプト

## 参照

- P0898R3 Standard Library Concepts
- P1754R1 Rename concepts to standard_case for C++20, while we still can
- 制約式`std::bool_constant<cond>::value` - yohhoyの日記