我可以更改多少代码以保持 rand() 为给定种子提供相同的输出?

How much can I change code to keep rand() giving same output for given seed?

我正在实现一个算法。因为计算需要时间,而且我需要多次重复计算,所以我也保存到输出文件种子值。我的想法是,如果我需要获取有关正在发生的事情的更多信息(例如附加值、某个百分比、任何不会扰乱算法本身的东西),我可以重复程序的相同实例。

不幸的是,尽管我认为一切都按预期进行,但大约 20% 的种子实例在至少一个输出值中给出了不同的值。

我的问题是 - 代码中的哪些类型的更改会影响 srand() / rand() 在 C++ 中的工作方式? 每个 class 都经过编译分开,最后全部 link 在一起。 我可以实现功能,一切都会好起来的吗?只有当我通过 adding/removing class 字段更改程序中任何 class 的大小时,它才会中断吗?与heap/stack分配有关吗?

直到现在,我认为如果我播种 srand(),无论如何我都会有相同顺序的 rand() 值(例如,对于 srand(123),我总是第一个 rand() == 5,第二个 rand() == 8 等)。只有当我在两者之间放置更多 rand() 个调用时,我才能打破它。

我希望你能找到我想错的地方,或者你可以 link 一些对我有帮助的东西。

干杯 姆罗佐

您对 srand 的理解是正确的:使用特定值作为种子应该足以生成可重现的随机数序列。您应该调试您的应用程序以发现它以 non-reproducible 方式运行的原因。

这种行为的一个原因是隐藏 RNG 状态的竞争条件。引用自 C++ rand wiki:

It is implementation-defined whether rand() is thread-safe.

...

It is recommended to use C++11's random number generation facilities to replace rand().