9

我有我编写的遗留 C++ 代码来生成均匀随机数和高斯分布。它实现了 George Marsaglia 博士的算法,速度极快。(我正在使用它们为蒙特卡洛高维积分生成大量样本。)

我认为重新分解生成器和分发以使用新的 C++11 std::random 方案是一个好主意。

任何人都可以向我指出一个教程或一个很好的 std::random 参考,其中包括如何扩展它的必要信息?示例代码将是理想的。

更新。感谢大家的帮助。我现在已经为 Visual C++ 2010 附带的 std::normal_distribution 编写了一个替代品。在我的机器上,当由默认引擎提供时,替代品的速度提高了 26%。我有点失望,差异不是更大,但是,嘿,那是我的问题。:-)

4

2 回答 2

5

N3376是最新的 C++ 标准草案(这是 C++11 之后的版本,但它是 C++11 的绝佳快照)。

所有 C++11-random 都在:26.5 随机数生成 [rand]

26.5.1.4 随机数引擎要求 [rand.req.eng] 具有您的统一随机数生成器需要满足的所有要求。

26.5.1.6 随机数分布要求 [rand.req.dist] 具有您的高斯分布需要满足的所有要求。

26.5.8.5.1 类模板 normal_distribution [rand.dist.norm.normal] 是描述标准定义的高斯分布的部分。

C++11<random>非常像 STL,它设置了对随机数生成器(容器)和随机分布(算法)的要求,然后客户端可以混合和匹配两者。这是一个非常酷的设计。

抱歉,我不知道有什么好的教程。C++ 标准是一个很好的参考和一个糟糕的教程。但是,您显然在随机数领域受过良好的教育。因此,假设您对 C++ 有所了解,C++ 标准可能还不错。

<random>如果您想仔细阅读其源代码(例如),可以使用 的开源实现。一个例子是libc++。他们所要求的只是如果您重复使用他们的任何代码,您保留他们的版权声明。

编辑

是编写本教程的唯一资格。:-)

于 2012-07-31T02:54:16.347 回答
1

你可以通过阅读 boost 库的源代码学到很多东西,因为 C++11 中的许多提议都是从 boost 中采用的。

在此处查看示例 rng 引擎的接口:

http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine

我将首先实现 min max 种子和 operator() 功能,看看它是否作为 C++11 的有效引擎传递

于 2012-07-30T08:31:02.203 回答