文章

【翻译】用于科学计算的 C++11/14 新特性之四

总结 C++11/14 中与科学计算相关的新特性。

原文地址 www.numbercrunch.de

【翻译】用于科学计算的 C++11/14 新特性之四

随机数

C++98 继承了 C 语言的标准函数 randsrand 以及宏 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 进行授权