最終更新日時:
が更新

履歴 編集

function
<random>

std::piecewise_constant_distribution::コンストラクタ(C++11)

piecewise_constant_distribution();

template <class InputIteratorB, class InputIteratorW>
piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB,
                                InputIteratorW firstW);

template <class UnaryOperation>
piecewise_constant_distribution(initializer_list<RealType> bl, UnaryOperation fw);

template <class UnaryOperation>
piecewise_constant_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);

explicit piecewise_constant_distribution(const param_type& parm);

piecewise_constant_distributionオブジェクトの構築

  • piecewise_constant_distribution();

デフォルトコンストラクタ。
区間数列を{0.0, 1.0}、重み数列を{1.0}として構築し、[0.0, 1.0)の一様分布とする。

  • template <class InputIteratorB, class InputIteratorW>
    piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB,
    InputIteratorW firstW);

区間数列の範囲[firstB, lastB)および重み数列の範囲の先頭firstWを受け取るコンストラクタ。これら数列によって、区間ごとの値を、線形に変化する確率によって生成する分布オブジェクトを構築する。重み数列の要素数は、区間数列の要素数 - 1である。

範囲[firstB, lastB)の要素数が1以下の場合、区間数列を{0.0, 1.0}、重み数列を{1.0}として構築し、[0.0, 1.0)の一様分布とする。

要件: InputIteratorBInputIteratorWの要素型が、double型に変換可能であること。

  • template <class UnaryOperation>
    piecewise_constant_distribution(initializer_list<RealType> bl, UnaryOperation fw);

区間数列blおよび重み付けを計算する関数オブジェクトfwを受け取るコンストラクタ。
重み付け数列は、[bl.begin(), bl.end())の各隣接要素b1b2に対し、式fw((b1 + b2) / 2)で返された重みから構築する。

要件: UnaryOperation関数オブジェクトは、doubleに変換可能な型を返すこと。
計算量:fw関数オブジェクトの呼び出しが、要素数nを超えないものとする。

  • template <class UnaryOperation>
    piecewise_constant_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);

区間値の範囲を受け取るコンストラクタ。
nwは区間列の要素数、xminは区間の最小値、xmaxは区間の最大値、fwは各区間に対する重み値を求めるための単項関数オブジェクトである。UnaryOperation関数オブジェクトは、double型に変換可能な区間値を受け取り、区間に対応する確率値を返す。

以下の公式で確率列を構築する。δの値を0 < δ = (xmax−xmin)/nk番目の区間値b kxmin+k・δとして、k番目の確率 = fw(b k + δ/2)
nwが1以下だった場合、区間数列を{0.0, 1.0}、重み数列を{1.0, 1.0}として構築し、[0.0, 1.0)の一様分布とする。

計算量:fw関数オブジェクトの呼び出しが、要素数nを超えないものとする。

  • explicit piecewise_constant_distribution(const param_type& parm);

パラメータオブジェクトを受け取るコンストラクタ。param_typeは、このクラスのコンストラクタと同じオーバーロードを持ち、それらのコンストラクタのパラメータを保持している。このコンストラクタでは、paramオブジェクトが持っているパラメータを、このクラスのコンストラクタに転送する。

#include <iostream>
#include <random>
#include <array>

double always_one(double)
  { return 1.0; }

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

  // piecewise_constant_distribution();
  {
    std::piecewise_constant_distribution<> dist;

    double result = dist(engine);
    std::cout << "default constructor : " << result << std::endl;
  }

  // template <class InputIteratorB, class InputIteratorW>
  // piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB,
  //                                 InputIteratorW firstW);
  {
    std::array<double, 3> intervals = {0.0, 0.5, 1.0}; // 区間数列
    std::array<double, 3> densities = {0.3, 0.5};      // 重み数列

    std::piecewise_constant_distribution<> dist(
      intervals.begin(),
      intervals.end(),
      densities.begin()
    );

    double result = dist(engine);
    std::cout << "iterator range constructor : " << result << std::endl;
  }

  // template <class UnaryOperation>
  // piecewise_constant_distribution(initializer_list<RealType> bl, UnaryOperation fw);
  {
    std::piecewise_constant_distribution<> dist(
      {0.0, 1.0},
      always_one
    );

    double result = dist(engine);
    std::cout << "initializer list constructor : " << result << std::endl;
  }

  // template <class UnaryOperation>
  // piecewise_constant_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);
  {
    std::piecewise_constant_distribution<> dist(
      10,
      0.0,
      1.0,
      always_one
    );

    double result = dist(engine);
    std::cout << "min-max constructor : " << result << std::endl;
  }

  // explicit piecewise_constant_distribution(const param_type& parm);
  {
    typedef std::piecewise_constant_distribution<> dist_type;

    std::array<double, 3> intervals = {0.0, 0.5, 1.0}; // 区間数列
    std::array<double, 3> densities = {0.3, 0.5};      // 重み数列

    dist_type::param_type param(intervals.begin(), intervals.end(), densities.begin());
    dist_type dist(param);

    double result = dist(engine);
    std::cout << "parameter constructor : " << result << std::endl;
  }
}

出力例

default constructor : 0.454987
iterator range constructor : 0.586319
initializer list constructor : 0.740687
min-max constructor : 0.853464
parameter constructor : 0.49003

バージョン

言語

  • C++11

処理系

参照