我可以更改多少代码以保持 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()
.
我正在实现一个算法。因为计算需要时间,而且我需要多次重复计算,所以我也保存到输出文件种子值。我的想法是,如果我需要获取有关正在发生的事情的更多信息(例如附加值、某个百分比、任何不会扰乱算法本身的东西),我可以重复程序的相同实例。
不幸的是,尽管我认为一切都按预期进行,但大约 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()
.