【发布时间】:2012-05-25 09:00:18
【问题描述】:
所以,每次我在开发一些大的东西时,将多个模块组合在一起构建最终功能,我一直在想同一个问题:如果超过 1 个模块需要使用随机函数,那么在哪里初始化随机种子?
如果我有一个需要随机的类(例如,通过使用自我实现的快速排序对输入数组进行排序来初始化自身的类,所以我需要一个随机的枢轴选择),我通常有一个私有的 static bool isRandOn; 变量,所以在我开始随机枢轴选择之前,我会检查该变量,如果随机还没有打开,则执行srand(time(NULL));。
如果我在命名空间中有大量实用程序函数,我会做类似的事情:我将这样一个变量放在我的 utils 库中的匿名命名空间中,并与类做或多或少相同的事情.
我遇到的问题是在组合这些模块时。就其本身而言,我知道每个模块不会多次设置种子。但是,我希望能够同时使用不同数量的模块,我希望其他人能够独立于其他人使用我的一个或多个模块...
那么,处理多个需要随机种子的模块的最佳方法是什么?在每个模块中设置种子?根本不设置种子,而是记录随机的用法并让用户在他想使用模块时初始化种子?第三个?
【问题讨论】:
-
多次设置种子有什么问题?
-
我不知道,这就是我问的原因:) 如果在整个执行过程中有效地重置种子几次,它不会降低整个事情的随机性吗?
-
假设您每次都使用 time(NULL),并且无法真正预测 time() 将返回什么,我看不出一个随机数会如何更随机比下一个。
-
我猜我在问什么,你是在代码中间的某个地方调用 srand,还是有多个类在一开始就都调用它?如果你一开始就有 5 次调用,然后一直使用同一个种子,那也没关系......
-
因为我在多个项目中都想知道这一点,其中一些在运行时偶尔调用种子,其中一些只是在开始时,我想知道整体的最佳实践。跨度>