我编写了传统的C ++代码,用于生成统一的随机数和高斯分布。它实现了George Marsaglia博士非常快的算法。 (我正在使用它们为蒙特卡洛高维集成生成各种样本。)
我认为重新考虑生成器和分发以使用新的C ++ 11 std :: random方案是个好主意。
有人能指出我对std :: random的教程或一个很好的参考,包括如何扩展它的必要信息吗?示例代码是理想的。
更新。谢谢大家的帮助。我现在已经为Visual C ++ 2010附带的std :: normal_distribution写了一个替代品。在我的机器上,当由默认引擎提供时,替换速度提高了26%。我有点失望,差异不大,但嘿,这是我的问题。 : - )
答案 0 :(得分: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]是描述std定义的高斯分布的部分。
C ++ 11 <random>
非常像STL,因为它设置了随机数生成器(容器)和随机分布(算法)的要求,然后客户端可以混合和匹配这两者。这是一个非常酷的设计。
抱歉,我不知道一个好的教程。 C ++标准是一个很好的参考和糟糕的教程。然而,你显然在随机数领域受过良好教育。所以假设你对C ++有所了解,那么C ++标准可能不会太糟糕。
如果您想仔细阅读其源代码,可以使用<random>
的开源实现(例如)。一个例子是libc++。他们所要求的是,如果您重复使用他们的任何代码,您将保留其版权声明。
修改强>
您是唯一有资格编写本教程的人。 : - )
答案 1 :(得分:1)
你可以通过阅读boost库来学到很多东西,因为C ++ 11中的很多提议都是从boost中采用的。
在这里查看示例rng引擎的界面:
http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine
我首先要实现min max seed和operator()函数,看看它是否作为C ++ 11的有效引擎传递