<random>

公有成员函数 (public member function)
<random>

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

(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),它包括firstlast之间的所有元素,包括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


复杂度

线性复杂度,与可能值的数量成比例,最多。


另见