C++ 11中的随机数:是否有一种简单的方法可以在代码的一个位置播种生成器,然后在不同的函数中使用它?

Geo*_*org 5 c++ random c++11

在C++ 11之前,我使用过rand(),<cstdlib>并且选择在main()函数中生成(或不生成)生成器非常简单(例如),然后在libraryA中的某个函数生成的库中使用随机数.代码看起来像这样:

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

#include <cstdlib> // rand, RAND_MAX
double GetRandDoubleBetween0And1() {
   return ((double)rand()) / ((double)RAND_MAX);
}
Run Code Online (Sandbox Code Playgroud)

主程序:

#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());
   }
   // (...)
}
Run Code Online (Sandbox Code Playgroud)

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

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

容易,对吗?

现在我想GetRandDoubleBetween0And1()使用可用的C++ 11标准进行更新#include <random>.我已经阅读并看过这里那里的例子,但我没有看到如何使它适应我的三个模块.当然,在里面播种引擎GetRandDoubleBetween0And1()不是正确的做法......

你认为我必须将种子引擎传递main()UseSomeRandomness()LibraryA,然后UseSomeRandomness()传递给GetRandDoubleBetween0And1()LibraryB吗?或者有更简单的方法吗?

Lig*_*ica 5

你认为我必须将图库引擎从main()传递到LibraryA中的UseSomeRandomness(),然后从UseSomeRandomness()传递到LibraryB中的GetRandDoubleBetween0And1()吗?

是.

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

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

  • 对我现有的代码来说真是个坏消息! (2认同)