uniform_int_distribution a(), b(), min(), and max()

uniform_int_distribution a(), b(), min(), and max()

本文关键字:min and max distribution uniform int      更新时间:2023-10-16

http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution/paramshttp://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution/minhttp://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution/max

看起来成员函数a()等效于成员函数min(),而成员函数b()等价于max()

#include <iostream>
#include <random>
int main() {
    std::uniform_int_distribution<int> dist(5, 10);
    std::cout << "a " << dist.a() << 'n';
    std::cout << "b " << dist.b() << 'n';
    std::cout << "min " << dist.min() << 'n';
    std::cout << "max " << dist.max() << 'n';
}

指纹

a 5
b 10
min 5
max 10

当使用 gcc 的标准库编译时。这些函数是否真的相同,如果是,为什么定义a()b()

这些功能真的相同吗

它们是相同的,因为总是这样假设是合理和实用的。这是真的,但迂腐和误导说这不是绝对的保证。

我只能访问 MinGW 4.7.1,我认为它的标准库与 GCC 库相同。在其中,类模板uniform_int_distribution具有成员:

  /**
   * @brief Returns the inclusive lower bound of the distribution range.
   */
  result_type
  min() const
  { return this->a(); }
  /**
   * @brief Returns the inclusive upper bound of the distribution range.
   */
  result_type
  max() const
  { return this->b(); }

因此,在函数内联之后,(amin(和(bmax(应该被合并到相同的代码中。

阅读标准第 26.5.8.2.1 节,您会发现它(只是间接地(表示它们应该返回相同的值。因此,一个理智的库实现者将使它们实际上相同或至少没有太大的不同。


为什么定义 a(( 和 b((?

我只能猜测。它可能与一致性有关,但一致性是不太正式的。

在数学上,均匀分布是这样的:

P(i|a,b) = 1/(b-a+1)

而在uniform_int_distribution,我们有

uniform_int_distribution::a()
uniform_int_distribution::b()

对于伯努利分布和bernoulli_distribution

P(i|p) = [complicated]
bernoulli_distribution::p()

泊 松:

P(i|mean) = [complicated]
poisson_distribution::mean()

正常:

P(x|mean, standard-deviation) = [complicated]
normal_distribution::mean()
normal_distribution::stddev()

我们可以观察到它们都告诉他们的参数。它对通用代码没有用,但在某些情况下可能会有所帮助。

每个随机数分布D都必须有方法

D::result_type D::min();
D::result_type D::max();

它返回"由d operator()可能返回的值的最大下限和最小上限,由d参数的当前值确定"(§25.1.6,[rand.req.dist];引用自第3(d(段;要求在表117中(。

此外,还期望分布D及其关联的参数类型D::param_type(在下面的引号中称为P(将具有相应的构造函数和参数访问器。同一节第9段:

对于每个D构造函数,取参数对应于分布参数,P应具有相应的构造函数,这些构造函数应遵循相同的要求,并采用数量、类型和默认值相同的参数。此外,对于返回与分布参数对应的值的每个D成员函数,P应具有具有相同名称、类型和语义的相应成员函数。

因此,std::uniform_int_distribution::minstd::uniform_int_distribution::max是特定分布实例的可能返回值的边界,而std::uniform_int_distribution::astd::uniform_int_distribution::b是构造该特定实例的参数值。碰巧的是,在std::uniform_{int,real}_distribution的特定情况下,参数精确地对应于边界,但要求建议应该同时提供边界和参数。

我想也可以调用参数访问器 minmax ,但委员会选择不这样做。

a()b()返回分布参数,而min()max()返回最小和最大潜在生成值。对于均匀分布,min()a() 返回的值相等,对于 max()b() 是相同的。一般来说,对于其他发行版可能没有这样的对应关系,所以我想a()b()是为了保持一致性。