uniform_int_distribution a(), b(), min(), and max() 均匀整型分布a()、b()、min()和max()

4

http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution/params http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution/min http://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()函数?

所有的发行版都是这样吗? - QuentinUK
3个回答

3
这些函数真的完全相同吗?
它们是完全相同的,因为总是假设它们是这样的是合理而实用的。说它不是绝对保证是正确的,但过于追求技巧和误导。
我只能访问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()

我们可以观察到它们都告诉了它们的参数。这对于通用代码来说并不是很有用,但在某些情况下可能会有所帮助。

接受此答案是因为它展示了其他发行版具有不同命名但概念类似的成员函数。 - David Stone

2
每个随机数分布 D 必须有方法。
D::result_type D::min();
D::result_type D::max();

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

此外,还有一个期望,即分布及其关联参数类型(以下引用中称为

)将具有相应的构造函数和参数访问器。同一节的第9段:

对于的每个构造函数,该构造函数接受与分布参数相对应的参数,

都必须有相应的构造函数,满足相同的要求,并接受相同数量、类型和默认值的参数。此外,对于的每个返回与分布参数相对应的值的成员函数,

都必须有一个相应的成员函数,名称、类型和语义相同。

所以,std::uniform_int_distribution::minstd::uniform_int_distribution::max是特定分布实例可能返回的边界,而std::uniform_int_distribution::astd::uniform_int_distribution::b是构造该特定实例的参数值。恰好,在std::uniform_{int,real}_distribution的特定情况下,参数与边界完全对应,但要求提供边界和参数。我想也许还可以将参数访问器称为minmax,但委员会选择不这样做。

1

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


2
除了uniform_real_distribution之外,似乎没有其他提供a()b()成员函数的分布。你知道还有其他的吗?所以我想确实是为了保持一致性而保留它们。 - vsoftco
@vsoftco 不,我没有。每个发行版都有不同命名的参数。 - vitaut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接