C 11中的怪异RNG行为在定义并在不同的位置进行调用
Weird RNG behavior in C++11 when defined and called in different places
我正在尝试编写一个多文件程序,包括以下与随机数相关的代码:
在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之间输出三个随机数,但是,rnd1
和rnd3
生成了正确的结果,但是rnd2
保持0?!
我在这里完全感到困惑,外部文件中的定义 help.h 和 main.cpp 之间有什么区别main()?
在我的实际工作中,我需要以rnd2
的形式编写代码,但是现在它不起作用,我不知道为什么。
任何人都可以说明rnd1
,rnd2
和rnd3
之间的区别并让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
文件中,并使其可用,而不是外部变量。
甚至更好,如果您的意图是使其成为单身人士,那就这样做。将它们放入单例类,然后使用MySingletonGenerator::instance().nextValue()
。
相关文章:
- 在 C 代码中调用 Python 函数时第三次出现访问冲突写入位置错误
- 非常量调用 const 成员函数失败,只读位置C++
- 为同一存储位置调用构造函数两次是否合法?
- 向量如何在特定位置调用复制构造函数
- 调用 GetPointerFrameTouchInfo时出现错误 998(对内存位置的无效访问)
- 在我的 BST 实现中,我的 findNode 函数没有将父位置返回给其调用函数
- 调用隔离后访问冲突执行位置0x0000000000000000:New()
- 即使在同一类型上,也可以将击曲线调用新的位置
- C 11中的怪异RNG行为在定义并在不同的位置进行调用
- 从新位置调用函数时C 细分故障
- 如何在下一次函数调用中使用 STL 映射擦除从最后一个位置
- 内存集调用位置的"error: expected constructor, destructor, or type conversion before '(' token"
- 发生 JNI 调用 c++ dll "不满意链接错误: 对内存位置的无效访问"
- 可以't更改船舶位置,函数调用不起作用
- 在dll中调用LoadLibrary的位置
- 如何使用Google测试在Main()函数中的特定位置调用特定的测试功能
- C++:I用不同的位置调用字符串 substr 两次,转换为常量字符 *,它们返回相同的,为什么
- 从内存位置调用函数指针
- 在类作用域内定义方法时,除非在原始 cpp 文件中的其他位置调用方法,否则项目不会编译
- 从特定位置调用Upper_bound函数,而不是使用data.begin()