所以,每次我开发一些大型的东西,多个模块一起构建最终的功能时,我一直在想同一个问题:如果超过一个模块需要使用随机函数,那么在哪里初始化随机种子呢?
如果我有一个需要随机的类(例如,通过对输入数组进行自实现的快速排序来初始化自己的类,所以我需要一个随机的枢轴选择),我通常有一个私有的static bool isRandOn;变量,所以在开始随机枢轴选择之前,我检查这个变量,如果还没有随机的话做srand(time(NULL));。
如果我在名称空间中有大量实用程序函数,我会做一件非常类似的事情:我将这样一个变量放在我的utils库中的一个匿名名称空间中,并做一些与类相同的事情。
我遇到的问题是当合并这些模块时。通过它自己,我知道每个模块将不会设置种子不止一次。但是,我希望能够在一起使用不同数量的模块,我希望其他人能够独立于其他模块使用我的一个或多个模块。
那么,处理多个随机种子需要模块的最佳方法是什么?在每个模块中设置种子?不要设置种子,而是记录随机的使用,让用户初始化种子,如果他想使用该模块?第三种?
发布于 2012-05-25 09:07:29
您可以为随机数生成创建一个特殊的“模块”,并从应用程序的其他部分使用该模块。然后,当随机数模块初始化时,您只需种子一次。
发布于 2012-05-25 09:29:22
@penelope给出了正确的答案。在rand()后面有一些生成伪随机数序列的复杂算法.这就像一些函数rand_func(prev_rand),它从前一个函数生成下一个伪随机数.这是您第一次调用srand(time(NULL)),它将prev_rand设置为假定time(NULL)非常不确定。因此,您可以安全地多次调用srand() (设置)。
特别的问题是,如果你需要可预测的伪随机序列,例如,srand(0)等,但它似乎不是你的情况。
发布于 2018-08-23 14:51:04
避免重复相同的初始随机序列的最佳方法是在调用random()函数的每个模块中执行以下操作:
/* Global variable to remember if we already initialized the PRNG */
static bool seed_initialized = false;
/* Helper function to avoid having always the same sequence again and again */
static void
prng_init (unsigned int seed)
{
if (!seed_initialized)
{
srandom (seed);
seed_initialized = true;
}
}而且,每次在函数中使用random()时,都会使用如下内容启动该函数:
/* Initializing PRNG with a 'reasonably strong' random seed for our purpose */
prng_init (time (NULL) - getpid());这样,你就能确保:
希望能帮上忙!
https://stackoverflow.com/questions/10751458
复制相似问题