我想提供一个号码,然后收到一组随机数。但是,我希望这些数字是相同的,无论我在哪台计算机上运行它(假设我提供相同的种子)。
基本上我的问题是:在C ++中,如果我使用rand()
,但是使用用户定义的种子而不是当前时间提供srand()
,我是否能够生成相同的随机数任何计算机上的数字流?
答案 0 :(得分:7)
有许多PRNG可用作库。选一个。我倾向于使用Mersenne Twister。
通过使用外部提供的库,您可以避免执行语言库rand()
的奇怪或错误的风险。只要您的平台都符合相同的数学语义,您就会得到一致的结果。
答案 1 :(得分:5)
srand()
& rand()
不属于STL。它们实际上是C运行时的一部分。
是的,只要它与srand()/rand()
的实现相同,它们就会产生相同的结果。
根据您的需要,您可能需要考虑使用Boost.Random。它提供了几个高质量的随机数生成器。
答案 2 :(得分:4)
假设rand()
的实现是相同的,是的。
确保这一点的最简单方法是在程序中包含已知的rand()实现 - 包含在项目的源代码中或以您可以管理的库的形式。
答案 3 :(得分:1)
编写自己的伪随机数例程。互联网上记录了很多算法,他们有许多rand不够好的应用程序(例如Perlin Noise)。
为初学者尝试以下链接:
答案 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()返回的数字序列将始终相同。