最終更新日時(UTC):
が更新

履歴 編集

function template
<random>

std::generate_canonical(C++11)

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>

int main()
{
  std::random_device seed_gen;
  std::mt19937 engine(seed_gen());

  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;
  }
}

出力

0.93695
0.880826
0.0535227
0.174785
0.989711
0.393811
0.588513
0.383415
0.920717
0.216669

バージョン

言語

  • C++11

処理系

備考

  • GCC 4.9時点において、float型を指定した場合に、値1.0が生成されることがあるバグがある(Bug 63176)
  • Clang 3.3時点において、値1.0が生成されることがある(Bug 18767)

参考

  • N3337 p.909 §26.5.7.2

参照