function
std::piecewise_linear_distribution::コンストラクタ(C++11)
piecewise_linear_distribution(); // (1)
template <class InputIteratorB, class InputIteratorW>
piecewise_linear_distribution(InputIteratorB firstB,
InputIteratorB lastB,
InputIteratorW firstW); // (2)
template <class UnaryOperation>
piecewise_linear_distribution(std::initializer_list<RealType> bl,
UnaryOperation fw); // (3)
template <class UnaryOperation>
piecewise_linear_distribution(std::size_t nw,
RealType xmin,
RealType xmax,
UnaryOperation fw); // (4)
explicit piecewise_linear_distribution(const param_type& parm); // (5)
概要
- (1) : デフォルトコンストラクタ。区間数列を
{0.0, 1.0}、重み数列を{1.0, 1.0}として構築し、[0.0, 1.0)の一様分布とする。
- (2) : 区間数列の範囲
[firstB, lastB)および重み数列の範囲の先頭firstWを受け取るコンストラクタ。これら数列によって、区間ごとの値を、線形に変化する確率によって生成する分布オブジェクトを構築する。
- 範囲
[firstB, lastB)の要素数が1以下の場合、区間数列を{0.0, 1.0}、重み数列を{1.0, 1.0}として構築し、[0.0, 1.0)の一様分布とする。
- (3) : 区間数列
blおよび重み付けを計算する関数オブジェクトfwを受け取るコンストラクタ。
- 重み付け数列は、
[bl.begin(), bl.end())の各要素bに対し、式fw(b)で返された重みから構築する。
- (4) : 区間値の範囲を受け取るコンストラクタ。
nwは区間列の要素数、xminは区間の最小値、xmaxは区間の最大値、fwは区間列それぞれのインデックスに対する重み値を求めるための単項関数オブジェクトである。UnaryOperation関数オブジェクトは、double型に変換可能な区間値を受け取り、その区間に対する確率値を返す。
- 以下の公式で確率列を構築する。δの値を
0 < δ = (xmax−xmin)/nとして、k番目の確率 = fw(xmin + k)。
nwが1以下だった場合、区間数列を{0.0, 1.0}、重み数列を{1.0, 1.0}として構築し、[0.0, 1.0)の一様分布とする。
- (5) : パラメータオブジェクトを受け取るコンストラクタ。
param_typeは、このクラスの(5)以外のコンストラクタと同じオーバーロードを持ち、それらのコンストラクタのパラメータを保持している。このコンストラクタでは、paramオブジェクトが持っているパラメータを、このクラスのコンストラクタに転送する。
要件
- (2) :
InputIteratorBとInputIteratorWの要素型が、double型に変換可能であること
- (3) :
UnaryOperation関数オブジェクトは、doubleに変換可能な型を返すこと
- (3), (4) :
fw関数オブジェクトの呼び出し回数が、要素数nを超えないものとする
例
#include <iostream>
#include <random>
#include <array>
#include <cstdint>
double always_one(double)
{ return 1.0; }
int main()
{
std::random_device seed_gen;
std::uint32_t seed = seed_gen();
std::default_random_engine engine(seed);
// (1)
{
std::piecewise_linear_distribution<> dist;
double result = dist(engine);
std::cout << "default constructor : " << result << std::endl;
}
// (2)
{
std::array<double, 3> intervals = {0.0, 0.5, 1.0}; // 区間数列
std::array<double, 3> densities = {0.0, 0.5, 0.0}; // 重み数列
std::piecewise_linear_distribution<> dist(
intervals.begin(),
intervals.end(),
densities.begin()
);
double result = dist(engine);
std::cout << "iterator range constructor : " << result << std::endl;
}
// (3)
{
std::piecewise_linear_distribution<> dist(
{0.0, 1.0},
always_one
);
double result = dist(engine);
std::cout << "initializer list constructor : " << result << std::endl;
}
// (4)
{
std::piecewise_linear_distribution<> dist(
10,
0.0,
1.0,
always_one
);
double result = dist(engine);
std::cout << "min-max constructor : " << result << std::endl;
}
// (5)
{
using dist_type = std::piecewise_linear_distribution<>;
std::array<double, 3> intervals = {0.0, 0.5, 1.0}; // 区間数列
std::array<double, 3> densities = {0.0, 0.5, 0.0}; // 重み数列
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.724384
iterator range constructor : 0.157439
initializer list constructor : 0.174376
min-max constructor : 0.411983
parameter constructor : 0.260002
バージョン
言語
処理系
参照