uniform_int_distribution a(), b(), min(), and max()
uniform_int_distribution a(), b(), min(), and max()
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(); }
因此,在函数内联之后,(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()
我们可以观察到它们都告诉他们的参数。它对通用代码没有用,但在某些情况下可能会有所帮助。
每个随机数分布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::min
和std::uniform_int_distribution::max
是特定分布实例的可能返回值的边界,而std::uniform_int_distribution::a
和std::uniform_int_distribution::b
是构造该特定实例的参数值。碰巧的是,在std::uniform_{int,real}_distribution
的特定情况下,参数精确地对应于边界,但要求建议应该同时提供边界和参数。
我想也可以调用参数访问器 min
和 max
,但委员会选择不这样做。
a()
并b()
返回分布参数,而min()
和max()
返回最小和最大潜在生成值。对于均匀分布,min()
和 a()
返回的值相等,对于 max()
和 b()
是相同的。一般来说,对于其他发行版可能没有这样的对应关系,所以我想a()
和b()
是为了保持一致性。
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 如何使用std::min和std::less返回对象
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 关于 std::min, std::max 中的比较运算符的混淆
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- uniform_int_distribution a(), b(), min(), and max()
- std::vector and std::min behavior
- OpenMP min reduction and std::min
- min and max Variadic Template variant in C++11?
- std::max() and std::min() not constexpr