扩展C++11随机数生成器和分布的教程或示例代码

9
我有一些遗留的C++代码,用于生成均匀分布随机数和高斯分布。它实现了George Marsaglia博士的算法,速度非常快。(我使用它们来生成大量样本进行蒙特卡罗高维积分。)
我认为重构生成器和分布以适应新的C++11 std::random方案是一个好主意。
有没有人能指点我一个std::random的教程或好的参考资料,其中包括如何扩展它所需的必要信息?最好提供示例代码。
更新。感谢大家的帮助。我现在已经编写了一个可直接替换Visual C++ 2010附带的std::normal_distribution的程序。在我的电脑上,当使用默认引擎时,这个替代程序比原来的快26%。我有点失望差距不够大,但嘿,这是我的问题。 :-)

@JiveDadson:为什么您想要替换引擎?无论如何,请参考其他链接中的参考资料以获取其他类型的分布;正态分布已包含在内。 - Kerrek SB
2
@Kerrek SB:正如我在问题中所说的,我之所以想这样做,是因为Marsaglia博士的算法非常快。 - Jive Dadson
@JiveDadson:那么你为什么想要使用C++11生成器呢?此外,请确保您理解C++11使用的分离:生成器产生均匀分布的整数流,而分布则产生从给定分布中抽样的随机分布值。也许您只想将其中一部分与您的代码集成? - Kerrek SB
2
@Kerrek SB:我知道生成器和分布的作用。我想重构其中的一个,使其与std::random兼容。不要问为什么。感谢您的帮助。 - Jive Dadson
2
随机数引擎的要求在标准中的§26.5.1.3和§26.5.1.4节中。分布的要求在§26.5.1.6中。您可以在此处找到标准草案文档:https://github.com/cplusplus/draft/blob/master/papers/n3337.pdf - R. Martinho Fernandes
显示剩余4条评论
2个回答

5

N3376是最新的C++标准草案(这是C++11之后的版本,但是是C++11的一个很好的快照)。

C++11中所有与随机数相关的内容都在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]是描述std定义的高斯分布的部分。

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

抱歉,我不知道有什么好的教程。C++标准是一本很好的参考书,但是不是一个好的教程。不过,您显然在随机数领域很有学问。因此,假设您对C++有一定的了解,C++标准可能不会太糟糕。

如果您想查看其源代码(例如),则可以使用<random>的开源实现。一个例子是libc++。他们只要求您保留他们的版权声明,如果您重用他们的代码。

编辑

是编写本教程的最佳人选。 :-)


我想阅读libc++的代码。虽然我不会使用它,但它可能对解决问题有所帮助。我查看了网页,似乎没有简单的方法来获取包含文件。(我被困在Windows环境中。) - Jive Dadson
我找到了浏览libc++的地方。http://llvm.org/svn/llvm-project/libcxx/trunk/include/ - Jive Dadson

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接