在哪里初始化随机种子以供多个随机模块使用?

pen*_*ope 5 c++ random srand

因此,每次我开发一些大的东西,将多个模块组合在一起构建最终功能时,我一直在想同样的问题:如果超过 1 个模块需要使用随机函数,那么在哪里初始化随机种子?

如果我有一个需要随机的类(例如,通过使用自行实现的快速排序对输入数组进行排序来初始化自身的类,因此我需要一个随机数作为主元选择),我通常有一个私有变量,static bool isRandOn;所以在开始之前随机枢轴选择,我检查该变量,srand(time(NULL));如果随机尚未启用,则执行此操作。

如果命名空间中有大量实用函数,我会做非常类似的事情:我将这样的变量放在 utils 库内的匿名命名空间中,并执行与类大致相同的操作。

我遇到的问题是组合这些模块时。就其本身而言,我知道每个模块不会多次设置种子。但是,我希望能够一起使用不同数量的模块,我希望其他人能够独立于其他模块使用我的一个或多个模块......

那么,处理多个需要随机种子的模块的最佳方法是什么?在每个模块中设置种子?根本不设置种子,而是记录随机数的使用,并让用户在想要使用该模块时初始化种子?第三种东西?

Mat*_* M. 2

我建议使用 Boost.Random 而不是依赖于程序级别共享的某些全局状态。

Boost.Random 有两个概念:

  • 引擎:生成随机数
  • 分布:调整引擎的结果以提供符合特定分布的结果(正态分布、泊松分布、高斯分布等)

每个模块可能有自己的引擎,或者实际上有几个引擎:没有特定的理由让同一模块内的几个不同功能之间共享给定的引擎。

最后一句话:无论你做什么,都要确保你有办法确定性地设置种子以用于错误重现的目的。错误重现可能会受益于多个引擎(部件的隔离有帮助)。