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

时间:2009-03-16 19:32:06

标签: c++ stl random

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

基本上我的问题是:在C ++中,如果我使用rand(),但是使用用户定义的种子而不是当前时间提供srand(),我是否能够生成相同的随机数任何计算机上的数字流?

7 个答案:

答案 0 :(得分:7)

有许多PRNG可用作库。选一个。我倾向于使用Mersenne Twister

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

MT是我的最爱,因为我是一名物理学家,我将这些东西用于蒙特卡洛,其中保证向高维度均等分布非常重要。但不要使用MT作为加密PRNG!

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

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

为初学者尝试以下链接:

http://en.wikipedia.org/wiki/Linear_congruential_generator

http://en.wikipedia.org/wiki/Pseudorandom_number_generator

答案 4 :(得分:1)

不,ANSI C标准指定rand()必须生成0到RAND_MAX之间的随机整数流,该流必须至少为32767(source)。此流必须是确定性的,因为对于给定机器上的给定实现,它必须在给定相同种子的情况下生成相同的整数流。

你想要一个便携式PRNG。 Mersenne Twister(在底部链接的许多实现)非常便携,Ben Pfaff's homegrown C99-compliant PRNG也是如此。 Boost.Random也应该没问题;当你用C ++编写代码时,使用Boost并不会限制你对平台的选择(尽管一些“较小”(即不符合)的编译器可能会因大量使用模板元编程而遇到麻烦)。这对于小批量嵌入式平台和新型研究架构来说只是一个问题,所以如果“任何计算机”是指“GCC所针对的任何x86 / PPC / ARM / SPARC / Alpha /等平台”,那么任何一个上面应该没问题。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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