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

时间:2015-12-10 02:09:15

标签: c++ c++11 std

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()

3 个答案:

答案 0 :(得分: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()

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

答案 1 :(得分:1)

#!/usr/bin/perl use strict; use Data::Dumper; my %master; my %tmphash; my $oldid=""; my $id; # Create a hash-of-hashes while (<>) { if (/^ID: (.*)/) { $id=$1; # We need to skip the first one to "prime the pump" if ($oldid ne "") { $master{$oldid}={%tmphash}; } $oldid=$id; %tmphash=(); } else { # Until we get to the next ID: add anything we find to tmphash if (/^(.*): (.*)/) { $tmphash{$1}=$2; } } } # Don't forget the last one... $master{$oldid}={%tmphash}; print Dumper(\%master); foreach my $id (sort keys %master) { foreach my $attr (keys %{ $master{$id} }) { print "$id, $attr: $master{$id}{$attr}\n"; } } a()返回分发参数,而b()min()返回最小和最大可能生成的值。对于统一分布,max()min()返回的值相等,a()max()的值相同。一般来说,对于其他发行版可能没有此类通信,因此我认为b()a()是一致的。

答案 2 :(得分:1)

每个随机数分布D必须包含方法

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

返回“d的{​​{1}}可能返回的值的最大下限和最小上限,由operator()参数的当前值确定” (§25.1.6,d;引用来自第3(d)段;要求见表117)。

此外,期望分发[rand.req.dist]及其关联的参数类型D(在以下引文中称为D::param_type)将具有相应的构造函数和参数访问器。同一节第9段:

  

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

因此Pstd::uniform_int_distribution::min是特定分布实例的可能返回值的边界,而std::uniform_int_distribution::maxstd::uniform_int_distribution::a是构造该特定实例的参数值。碰巧的是,在std::uniform_int_distribution::b的特定情况下,参数精确地对应于边界,但是要求表明应该提供边界和参数。

我想也可以调用参数访问器std::uniform_{int,real}_distributionmin,但委员会选择不这样做。