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()
?
答案 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(); }
因此,在函数内联之后,(a
和min
)和(b
和max
)应该被转换为相同的代码。
阅读标准部分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
应具有相同的成员函数,具有相同的名称,类型和语义。
因此P
和std::uniform_int_distribution::min
是特定分布实例的可能返回值的边界,而std::uniform_int_distribution::max
和std::uniform_int_distribution::a
是构造该特定实例的参数值。碰巧的是,在std::uniform_int_distribution::b
的特定情况下,参数精确地对应于边界,但是要求表明应该提供边界和参数。
我想也可以调用参数访问器std::uniform_{int,real}_distribution
和min
,但委员会选择不这样做。