我基于 C++ rand()函数在我的程序中生成了几千个对象。将它们保存在内存中将是详尽无遗的。有没有办法在任何给定时间复制 rand() 的当前种子?这将使我有机会仅存储当前种子而不是完整对象。(因此我可以通过重新生成完全相同的随机数子序列来重新生成这些对象)
一个详尽的解决方案是存储由rand()给出的完整随机数序列- 不值得。另一个解决方案是实现我自己的随机数类。
谷歌没有给我任何积极的线索。有数百篇文章教授 rand 和 srand 的基础知识,我找不到具体的。
有谁知道其他带有种子窃取器的随机数生成器?
感谢您的快速答复!这个问题有更多可能的答案/解决方案,所以我在这里列出了你的答案。
解决方案:
简短的回答是:没有获取种子的标准方法
最接近的解决方法是在开头保存 INITIAL 种子,并计算调用 rand() 函数的次数。我将此标记为解决方案,因为它适用于每个编译器的当前std::rand()函数(这是主要问题)。我对我的 2.0 GHz CPU 进行了基准测试,发现我可以在 35 秒内调用&count rand() 1,000,000,000 次。这听起来不错,但我有 80,000 次调用来生成一个对象。这将代数限制为 50,000,因为 unsigned long 的大小。无论如何,这是我的代码:
class rand2 { unsigned long n; public: rand2 () : n(0) {} unsigned long rnd() { n++; return rand(); } // get number of rand() calls inside this object unsigned long getno () { return n; } // fast forward to a saved position called rec void fast_forward (unsigned long rec) { while (n < rec) rnd(); } };
另一种方法是实现您自己的伪随机数生成器,就像 Matteo Italia 建议的那样。这是最快的,也可能是最好的解决方案。您不限于 4,294,967,295 次rand()调用,也不需要使用其他库。值得一提的是,不同的编译器有不同的生成器。我已经将 Matteo 的LCG与Mingw/GCC 3.4.2 和 G++ 4.3.2 中的rand()进行了比较。他们三个都是不同的(种子= 0)。
使用 C++11 或 Cubbi、Jerry Coffin 和 Mike Seymour 建议的其他库的生成器。如果您已经在与他们合作,这是最好的主意。C++11 生成器的链接:http: //en.cppreference.com/w/cpp/numeric/random (这里也有一些算法描述)