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 ✅