C ++ STL中的确定性随机数流

Deterministic Random Number Streams in C++ STL

我想提供一个数字,然后接收一组随机数字。但是,我希望这些数字是相同的,不管我在哪台计算机上运行它(假设我提供相同的种子)。

基本上,我的问题是:在C++中,如果我使用EDCOX1,0个,但是用用户定义的种子而不是当前的时间提供EDCOX1×1,那么我能在任何计算机上产生相同的随机数流吗?


图书馆有几十个图书馆。选择一个。我喜欢用旋转木马。

通过使用外部提供的库,您可以绕过对您的语言库rand()进行奇怪或错误实现的风险。只要你的平台都符合相同的数学语义,你就会得到一致的结果。

mt是我的最爱,因为我是一个物理学家,我把这些东西用于蒙特卡洛,在那里保证高维的均匀分布是很重要的。但不要将mt用作密码prng!


srand()rand()不是STL的一部分。它们实际上是C运行时的一部分。是的,只要srand()/rand()的实现相同,它们就会产生相同的结果。

根据您的需要,您可能需要考虑使用boost.random。它提供了几个高质量的随机数生成器。


假设rand()的实现是相同的,是的。

确保这一点的最简单方法是在程序中包含一个已知的rand()实现——或者包含在项目的源代码中,或者以您可以管理的库的形式。


不,ansi c标准只规定rand()必须产生一个介于0和rand_max之间的随机整数流,它必须至少是32767(源)。此流必须是确定性的,因为对于给定计算机上的给定实现,它必须生成具有相同种子的相同整数流。

你想要一个便携式的prng。Mersenne Twister(许多实现在底部链接)非常可移植,Ben Pfaff的国产C99兼容PRNG也是如此。Booost。随机也应该是好的;当你在C++中编写你的代码时,使用Boost并不限制你的平台选择(虽然一些"较小")(即不兼容)编译器可能会对其大量使用模板元编程产生麻烦。这对于小容量的嵌入式平台和新型的研究体系结构来说只是个问题,所以如果"任何一台计算机"的意思是"GCC所针对的任何x86/ppc/arm/sparc/alpha/etc.平台",那么上述任何一个都应该做得很好。


编写自己的伪随机数例程。互联网上记录了很多算法,它们有许多应用程序,其中rand不够好(例如perlin噪声)。

尝试以下链接作为初学者:

http://en.wikipedia.org/wiki/linear_同余_generator

http://en.wikipedia.org/wiki/pseudorandom_number_生成器


对。对于给定的种子(起始值),rand()返回的数字序列将始终相同。


我相信如果你提供相同种子的srand,你会得到相同的结果。这几乎就是用伪随机数生成器定义种子的过程。