c++ - std::uniform_int_distribution 的段错误

标签 c++ c++11 random segmentation-fault

我有一个包含多个类的程序,其中一些需要随机 double 和整数。在其中一个类中,我定义了一个结构体来为随机引擎提供种子,并能够在需要时通过该结构体的对象生成随机实数和整数。 带有类和结构声明的 .hpp 文件如下所示:

struct RNG {
public:
    static std::mt19937 gen;
    static std::uniform_int_distribution<uint32_t> dist_ui;
    static std::uniform_real_distribution<double> dist_d;
    uint32_t r_ui = dist_ui(gen);
    double r_d = dist_d(gen);
private:
    static unsigned seed;
};

class A {
private:
    uint32_t a_;
public:
    A();
};

.cpp 文件如下所示:

#include "A.hpp"

unsigned RNG::seed = 42;
std::mt19937 RNG::gen(RNG::seed);
std::uniform_int_distribution<uint32_t> RNG::dist_ui(1, std::numeric_limits<uint32_t>::max());
std::uniform_real_distribution<double> RNG::dist_d(0.0,1.0);

A::A() {
    RNG* r;
    a_ = r->dist_ui(r->gen);
}

现在,如果我调用uniform_real_distribution

r->dist_d(r->gen)

一切正常。但是,如果我用

调用uniform_int_distribution
r->dist_ui(r->gen)

如上面的代码片段所示,我遇到了段错误。如果我仅使用 int dist 而不是 real 和 int 定义结构,或者将 int dist 的边界更改为 [0,100) 或其他任何内容,也会发生该错误。 有人知道这里发生了什么吗?我感谢任何帮助!

编辑: 如果我像这样访问非静态成员,我会得到同样的错误

RNG r;
a_ = r.r_ui;

最佳答案

我在这里有一个猜测。 A 类型的对象也是静态/全局的吗?如果是这样,也许你的问题是因为静态初始化的顺序没有定义。因此,您在初始化之前访问 dist_ui。

如果情况并非如此,请发布其余代码(创建 A 实例的代码)。

关于c++ - std::uniform_int_distribution 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58905407/

相关文章:

c++ - Cocos2d replaceScene 不释放旧场景

c++ - 不同的 constexpr 行为 vs2015u2 vs gcc

python - 生成截断为小数点后两位的随机数

c++ - sc_core::sc_in<bool>::read() 上的 SystemC 段错误

C++ 循环链表 : remove element

c++ - RegOpenKeyEx 和 RegSetValueEx 失败,但我不知道为什么

php - 使用 MySQL 或 PHP 随机化结果更好吗?

c++ - 在 C++ 中,迭代器失效规则是否也适用于所有标准容器的指针?

c++ - 对象销毁时内存泄漏

java - 如何修复线性同余生成器中的模数?