c++ - C++11 : is there a simple way to seed the generator in one place of the code, 中的随机数然后在不同的函数中使用它?

标签 c++ c++11 random

在 C++11 之前,我使用 rand()来自 <cstdlib>选择在 main() 中播种(或不播种)生成器非常简单函数(例如),然后在 libraryA 中使用由 libraryB 中某个函数生成的随机数。代码如下所示:

LibraryB(生成随机数,老式的方式):

#include <cstdlib> // rand, RAND_MAX
double GetRandDoubleBetween0And1() {
   return ((double)rand()) / ((double)RAND_MAX);
}

主程序:

#include <cstdlib> // srand
#include <ctime> // time, clock
int main() {
   bool iWantToSeed = true; // or false,
                            // decide HERE, applies everywhere!
   if(iWantToSeed){
      srand((unsigned)time(0) + (unsigned int)clock());
   }
   // (...)
}

LibraryA(使用 LibraryB 中的随机数,根据 main() 中给出的种子生成):

#include "../folderOfLibraryB/Utils_random.h" // GetRandDoubleBetween0And1
void UseSomeRandomness(){
   for(int i = 0; i < 1000000; i++){
      double nb = GetRandDoubleBetween0And1();
      // (...)
   }
}

很简单,对吧?

现在我想更新GetRandDoubleBetween0And1()使用通过 #include <random> 提供的 C++11 标准.我已经阅读并看过示例 herethere ,但我不知道如何使其适应我的三个模块。当然,在里面播种引擎 GetRandDoubleBetween0And1()不是正确的做法...

你认为我必须通过 main() 的种子引擎吗?至 UseSomeRandomness()在 LibraryA 中,然后来自 UseSomeRandomness()GetRandDoubleBetween0And1()在图书馆B?或者有更简单的方法吗?

最佳答案

Do you think I will have to pass the seeded engine from main() to UseSomeRandomness() in LibraryA, then from UseSomeRandomness() to GetRandDoubleBetween0And1() in LibraryB?

是的。

您将生成器实例化一次,然后将指向它的引用或指针传递到要使用它的任何上下文中。

这就像处理任何其他资源一样。

关于c++ - C++11 : is there a simple way to seed the generator in one place of the code, 中的随机数然后在不同的函数中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44872676/

相关文章:

c++ - 为什么将返回类型定义为其类的方法不会给我一个 'incomplete type' 错误

c++ - 有没有一种方法可以让编译器在有点模棱两可的地方选择某个重载?

c++ - 如何为子类定义通用模板化创建函数

c++ - OpenMP:同时写入 std::map

javascript - 选择随机的 'eq' 的 div 但每次不同的 div

java - 如何使用 jni 将数据从 java InputStream 移动到 C++ 中的 char *?

c++ - 模板向后兼容 gcc 4.7

c++ - 指向 STL 容器的指针安全吗?

random - 从 32 位有限集生成伪随机非重复整数

python - 随机名称生成器策略 - 帮我改进它