gpt4 book ai didi

c++ - 在不同地方定义和调用时 C++11 中奇怪的 RNG 行为

转载 作者:行者123 更新时间:2023-11-27 23:49:28 26 4
gpt4 key购买 nike

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

在 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.hma​​in.cpp 中的定义有什么区别,内部调用和外部调用有什么区别主要()?

在我实际工作中,我需要将代码写成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 文件中并使其可用,而不是外部变量。

或者更好的是,如果您打算将其设为单例,那么就这样做吧。将这些放入 singleton class然后使用 MySingletonGenerator::instance().nextValue()

关于c++ - 在不同地方定义和调用时 C++11 中奇怪的 RNG 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47626283/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com