公有成员函数 (public member function)
<random>
(1) | discrete_distribution(); |
---|
(2) | template <class InputIterator> discrete_distribution (InputIterator first, InputIterator last); |
---|
(3) | discrete_distribution (initializer_list<double> il); |
---|
(4) | template <class UnaryOperation> discrete_distribution (size_t nw, double xmin, double xmax, UnaryOperation fw); |
---|
(5) | explicit discrete_distribution (const param_type& parm); |
---|
构造离散分布 (Construct discrete distribution)
构造一个 discrete_distribution 对象,其初始化方式取决于所使用的构造函数版本
- (1) 默认构造函数
- 该分布将始终产生零。
- (2) 范围构造函数 ((2) range constructor)
- 该序列的值被用作范围中每个整数值的权重,从0为(n-1),其中n是迭代器之间的距离。
- (3) 初始化列表 (initializer list)
- 该列表中的序列被用作每个整数值的权重,从0为(n-1),其中n是 初始化列表的大小。
- (4) 操作构造函数 ((4) operation constructor)
- 闭区间 [min, max] 中的每个整数值 k0和(nw-1)被赋予通过调用得到的权重
1
|
fw(xmin+(xmax-xmin)*(k+0.5)/nw)
|
- (5) 参数构造函数 ((5) param constructor)
- 该分布采用 parm 指定的分布参数。 (The distribution adopts the distribution parameters specified by parm.)
在所有上述情况中,如果n(或nw) 为零,则分布构造为好像定义了一个带有权重为一(w0=1)的单个元素。这样的分布将始终产生零。
所有权重必须是非负值,并且序列中的至少一个值必须是正值。 (All weights shall be non-negative values, and at least one of the values in the sequence must be positive.)
参数
- first, last
- 指向范围内初始位置和最终位置的输入迭代器。 使用的范围是[first,last),它包括first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
如果已知first==last,分布将始终产生零。
函数模板类型应为 输入迭代器,指向可转换为 (The function template type shall be an input iterator that points to some type convertible to)double.
- il
- il
这些对象是从初始化列表声明符自动构造的。
- nw
- 权重数量:分布能产生的最大数量为(nw-1).
- xmin,xmax
- 传递给 fw 的值范围的界限。传递给 fw 的第一个值是(xmin+(xmax-xmin)/2*n)然后,nw 个值以递增量((xmax-xmin)/2).
- 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.
- 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
|
// discrete_distribution constructor
#include <iostream>
#include <chrono>
#include <random>
#include <functional>
#include <array>
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,4> init = {1.0,2.0,3.0,4.0};
std::discrete_distribution<int> first;
std::discrete_distribution<int> second (init.begin(),init.end());
std::discrete_distribution<int> third {0.1,0.2,0.3,0.4};
std::discrete_distribution<int> fourth (4,0.0,40.0,std::bind2nd(std::plus<double>(),5.0));
std::discrete_distribution<int> fifth (fourth.param());
// display probabilities:
std::cout << "displaying probabilities:";
std::cout << std::endl << "first : ";
for (double x:first.probabilities()) std::cout << x << " ";
std::cout << std::endl << "second: ";
for (double x:second.probabilities()) std::cout << x << " ";
std::cout << std::endl << "third : ";
for (double x:third.probabilities()) std::cout << x << " ";
std::cout << std::endl << "fourth: ";
for (double x:fourth.probabilities()) std::cout << x << " ";
std::cout << std::endl << "fifth : ";
for (double x:fifth.probabilities()) std::cout << x << " ";
std::cout << std::endl;
return 0;
}
|
输出
displaying probabilities:
first : 1
second: 0.1 0.2 0.3 0.4
third : 0.1 0.2 0.3 0.4
fourth: 0.1 0.2 0.3 0.4
fifth : 0.1 0.2 0.3 0.4
|