- random[meta header]
- std[meta namespace]
- function template[meta id-type]
- cpp11[meta cpp]
namespace std {
template<class RealType, std::size_t bits, class URBG>
RealType generate_canonical(URBG& g);
}実数区間[0.0, 1.0)に展開(事実上正規化)された一様分布乱数を得るための関数テンプレート。
テンプレート引数に与える RealType 型について、 bits だけの分解能を持つ仮数部を URBG gを必要な回数だけ繰り返し呼び出して生成する。
class RealType: 生成する実数の型。size_t bits: 生成する実数における仮数部への分解能の最低要求。最大値はstd::numeric_limits<RealType>::digits。class URBG: 一様乱数生成器の型。
- URBG& g : 一様乱数生成器。
URBG g が例外を送出する場合はそれに準ずる。
#include <random>
#include <iostream>
#include <cstdint>
int main()
{
std::random_device seed_gen;
std::uint32_t seed = seed_gen();
std::mt19937 engine(seed);
for(int i = 0; i < 10; ++i) {
// floatの仮数部桁数で、範囲[0.0, 1.0)のランダムなfloat値を生成する
constexpr std::size_t bits = std::numeric_limits<float>::digits;
float result = std::generate_canonical<float, bits>(engine);
std::cout << result << std::endl;
}
}- std::generate_canonical[color ff0000]
- digits[link /reference/limits/numeric_limits/digits.md]
0.93695
0.880826
0.0535227
0.174785
0.989711
0.393811
0.588513
0.383415
0.920717
0.216669
- C++11
- Clang: 3.0 [mark verified]
- GCC: 4.4 [mark verified]
- ICC: ??
- Visual C++: ??
- GCC 4.9時点において、
float型を指定した場合に、値1.0が生成されることがあるバグがある(Bug 63176) - Clang 3.3時点において、値
1.0が生成されることがある(Bug 18767)
- N3337 p.909 §26.5.7.2
- P0346R1 A
<random>Nomenclature Tweak- URNGをURBGに変更