我正在尝试编写一个包含以下与随机数生成有关的代码的多文件程序:

在help.h文件中:

extern random_device rand_dev;
extern ranlux48 rand_eng;
extern uniform_real_distribution<> zero2one_dist;


在help.cpp文件中:

#include "help.h"
random_device rand_dev;
ranlux48 rand_eng{ rand_dev() };
uniform_real_distribution<> zero2one_dist(0, 1);


在main.cpp文件中

#include "help.h"
//identical as help.cpp, just for illustration of the problem
random_device rand_dev1;
ranlux48 rand_eng1{ rand_dev1() };
uniform_real_distribution<> zero2one_dist1(0, 1);
//random number generation
float rnd1 = zero2one_dist1(rand_eng1);
float rnd2 = zero2one_dist(rand_eng);
//main function
int main()
{
    //another random number generation.
    float rnd3 = zero2one_dist(rand_eng);
    //output
    cout << rnd1 << endl << rnd2 << endl << rnd3 << endl;
    return 0;
}


期望的结果是输出0到1之间的三个随机数,但是rnd1rnd3会生成正确的结果,但是rnd2保持0 ?!

我在这里完全感到困惑,外部文件help.h和main.cpp中的定义之间有什么区别,以及在main()内部和外部之间的调用之间有什么区别?

在我的实际工作中,我需要以rnd2的形式编写代码,但是现在它不起作用了,我也不知道为什么。

谁能说明rnd1rnd2rnd3之间的区别并让rnd2工作?谢谢!

最佳答案

无法保证翻译单元之间的初始化顺序。 rnd2可以在zero2one_dist之前或之后初始化。如果您确实需要外部分发对象或辅助函数,请使用表格rnd3,例如:

float rand_zero2one()
{
   static random_device rand_dev;
   static ranlux48 rand_eng{ rand_dev() };
   static uniform_real_distribution<> zero2one_dist(0, 1);
   return zero2one_dist(rand_eng);
}


这样可以确保在首次调用该函数之前初始化静态变量。将其放在您的help文件中,并使其代替extern变量可用。

甚至更好,如果您的目的是使其成为单例,请这样做。将其放入singleton class中,然后使用MySingletonGenerator::instance().nextValue()

10-06 00:34