【翻译】用于科学计算的 C++11/14 新特性之四
总结 C++11/14 中与科学计算相关的新特性。
原文地址 www.numbercrunch.de
【翻译】用于科学计算的 C++11/14 新特性之四
随机数
C++98 继承了 C 语言的标准函数 rand
和 srand
以及宏 RAND_MAX
,用于生成伪随机数。这些函数存在几个问题。例如,从未明确指定 rand
用于产生伪随机数的算法是什么。因此,如果在 C 和 C++98 中使用 rand
,蒙特卡洛模拟的结果取决于所使用的标准库的实现。此外,在 C++98 中,很难生成某些非均匀分布的随机数。
因此,在 C++11 中引入了一个可移植的随机数生成器。所有与随机数生成相关的类都在头文件 random
中声明。随机数生成器由引擎和分布组成。引擎产生伪随机位模式的流,并能实现各种随机数生成算法,例如线性同余或梅森旋转算法。分布使用引擎的位来生成随机数,这些随机数依特定的分布而定,例如均匀分布、指数分布或高斯分布。以下代码给出了一个简单的例子。关于 C++11 随机数生成器的更详细解释可以在《C++11 中的随机数生成》 和视频 “rand()
被认为是有害的” 中找到。
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <random>
int main() {
// Mersenne Twister with default seed
std::mt19937 engine;
// exponential distribution with mean 1
std::exponential_distribution<> distribution(1);
for (int i(0); i<100; ++i)
std::cout << distribution(engine) << '\n';
}
本文由作者按照 CC BY 4.0 进行授权