首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在哪里初始化通过多个随机模块使用的随机种子?

在哪里初始化通过多个随机模块使用的随机种子?
EN

Stack Overflow用户
提问于 2012-05-25 09:00:18
回答 3查看 1.4K关注 0票数 4

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

如果我有一个需要随机的类(例如,通过对输入数组进行自实现的快速排序来初始化自己的类,所以我需要一个随机的枢轴选择),我通常有一个私有的static bool isRandOn;变量,所以在开始随机枢轴选择之前,我检查这个变量,如果还没有随机的话做srand(time(NULL));

如果我在名称空间中有大量实用程序函数,我会做一件非常类似的事情:我将这样一个变量放在我的utils库中的一个匿名名称空间中,并做一些与类相同的事情。

我遇到的问题是当合并这些模块时。通过它自己,我知道每个模块将不会设置种子不止一次。但是,我希望能够在一起使用不同数量的模块,我希望其他人能够独立于其他模块使用我的一个或多个模块。

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

EN

回答 3

Stack Overflow用户

发布于 2012-05-25 09:07:29

您可以为随机数生成创建一个特殊的“模块”,并从应用程序的其他部分使用该模块。然后,当随机数模块初始化时,您只需种子一次。

票数 1
EN

Stack Overflow用户

发布于 2012-05-25 09:29:22

@penelope给出了正确的答案。在rand()后面有一些生成伪随机数序列的复杂算法.这就像一些函数rand_func(prev_rand),它从前一个函数生成下一个伪随机数.这是您第一次调用srand(time(NULL)),它将prev_rand设置为假定time(NULL)非常不确定。因此,您可以安全地多次调用srand() (设置)。

特别的问题是,如果你需要可预测的伪随机序列,例如,srand(0)等,但它似乎不是你的情况。

票数 0
EN

Stack Overflow用户

发布于 2018-08-23 14:51:04

避免重复相同的初始随机序列的最佳方法是在调用random()函数的每个模块中执行以下操作:

代码语言:javascript
复制
/* 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()时,都会使用如下内容启动该函数:

代码语言:javascript
复制
 /* Initializing PRNG with a 'reasonably strong' random seed for our purpose */
 prng_init (time (NULL) - getpid());

这样,你就能确保:

  1. 您将至少在第一次通过时初始化您的PRNG;
  2. 将永远不会在模块中多次重新初始化随机序列。

希望能帮上忙!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10751458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档