公有成员函数
<random>

std::piecewise_constant_distribution::(构造函数)

(1)
piecewise_constant_distribution();
(2)
template <class InputIteratorB, class InputIteratorW>  piecewise_constant_distribution (InputIteratorB firstB, InputIteratorB lastB,                                   InputIteratorW firstW);
(3)
template <class UnaryOperation>  piecewise_constant_distribution (initializer_list<result_type> il, UnaryOperation fw);
(4)
template <class UnaryOperation>  piecewise_constant_distribution (size_t nw, result_type xmin, result_type xmax, UnaryOperation fw);
(5)
 explicit piecewise_constant_distribution (const param_type& parm);
构造分段常数分布
构造一个 piecewise_constant_distribution 对象,根据所使用的构造函数版本进行初始化。

(1) 默认构造函数
该分布生成范围内均匀分布的随机数。[0.0,1.0).
(2) 范围构造函数 ((2) range constructor)
范围内的值[firstB,lastB)用作子区间的*界限*(bi),而以...开头的序列firstW用作每个子区间的*权重*(wi)。
(3) 初始化列表构造函数
列表中的序列用作子区间的*界限*。每个子区间的权重是通过调用fw并以子区间中点(即其界限值之和的一半)作为参数获得的。
(4) 操作构造函数 ((4) operation constructor)
范围 [xmin, xmax) 被划分为 nw 个等长的子区间。每个子区间将获得调用
1
fw(xmin+(xmax-xmin)*(k+0.5)/nw)
其中 k 是子区间的序号(k=0对于第一个子区间,k=1对于第二个子区间,...)。
(5) 参数构造函数 ((5) param constructor)
该分布采用 parm 指定的分布参数。 (The distribution adopts the distribution parameters specified by parm.)

在以上所有情况下,如果界限数量少于 2(因此不足以形成一个区间),则分布产生的数值与默认构造时相同(生成范围内均匀分布的数值。[0,1)).

所有权重必须是非负值,并且序列中的至少一个值必须是正值。 (All weights shall be non-negative values, and at least one of the values in the sequence must be positive.)

参数

firstB, lastB
输入迭代器,指向指定子区间界限值范围的起始和结束位置。
使用的范围是[firstB,lastB),包括 first 指向的元素以及 firstBlastB 之间的所有元素,但不包括 lastB 指向的元素。
如果已知firstB==lastB类型,或++firstB==lastB,该分布将生成范围内均匀分布的数值。[0,1).
函数模板类型应为 输入迭代器,指向可转换为 (The function template type shall be an input iterator that points to some type convertible to)double.
firstW
输入迭代器,指向指定用于每个区间的权重的起始位置。使用的元素数量比子区间界限的数量少一个(即distance(firstB,lastB)-1).
il
一个 initializer_list 对象,包含一个子区间界限列表。
如果*初始化列表*少于2个元素,则分布将生成范围内均匀分布的数值。[0,1).
这些对象是从初始化列表声明符自动构造的。
fw
可以接受单个参数的类函数对象,该参数可从...转换为double并返回一个可转换为以下类型的值 (and return a value convertible to)。这可以是指向函数的指针、函数对象或 lambda 表达式, (This can can be a pointer to a function, a function object, or a lambda expression,)double。这可以是函数指针、函数对象或 lambda 表达式,
nw
由...定义的区间中子区间的数量[xmin,xmax)被分割。
如果设置为零,则假定有一个子区间。
size_t 是一个无符号整数类型。
xmin,xmax
分布可能值的区间界限。此区间被分割成nw等长的子区间。
xmax必须大于xmin (xmin<xmax).
result_type是一个成员类型,定义为第一个类模板参数的别名 (实数类型 (RealType)).
parm
一个表示分布参数的对象,通过调用成员函数 param 来获取。
param_type是一个成员类型。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// piecewise_constant_distribution constructor
#include <iostream>
#include <chrono>
#include <random>
#include <array>

double square (double val) {return val*val;}

class accumulator {
  double x;
public:
  accumulator() :x(0.0) {}
  double operator()(double val) {return x+=val;}
};

int main()
{
  // construct a trivial random generator engine from a time-based seed:
  unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
  std::default_random_engine generator (seed);

  std::array<double,5> intervals {0.0, 10.0, 20.0, 30.0, 40.0};
  std::array<double,4> weights {1.0, 2.0, 3.0, 4.0};

  typedef std::piecewise_constant_distribution<double> distribution_type;
  distribution_type first;
  distribution_type second (intervals.begin(), intervals.end(), weights.begin());
  distribution_type third ( {0.0, 10.0, 15.0, 20.0, 22.0}, square );
  distribution_type fourth ( 4, 0.0, 10.0, accumulator() );
  distribution_type fifth (fourth.param());

  std::cout << "displaying characteristics of fifth:" << std::endl;
  std::cout << "intervals: ";
  for (double x:fifth.intervals()) std::cout << x << " ";
  std::cout << std::endl;
  std::cout << "densities: ";
  for (double x:fifth.densities()) std::cout << x << " ";
  std::cout << std::endl;

  return 0;
}

可能的输出
displaying characteristics of fifth:
intervals: 0 2.5 5 7.5 10
densities: 0.0133333 0.0533333 0.12 0.213333


复杂度

线性复杂度,子区间数量最多。

另见