在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吗?或者有更简单的方法吗?
你认为我必须将图库引擎从main()传递到LibraryA中的UseSomeRandomness(),然后从UseSomeRandomness()传递到LibraryB中的GetRandDoubleBetween0And1()吗?
是.
您实例化一次生成器,然后将引用或指针传递给任何想要使用它的上下文.
这就像处理任何其他资源一样.