0

假设我有一个课程如下:

class Test {
public:
    Test() : mt((std::random_device())()), dist1(0, 10), dist2(0, 100) {}
    void func() {
        if (dist1(mt) < 4) {
            // do something
        }
    }
    void func2() {
        if (dist2(mt) > 25) {
            // do something
        }
    }
private:
    std::mt19937 mt;
    std::uniform_int_distribution<int> dist1;
    std::uniform_int_distribution<int> dist2;
};

如您所见,有两个函数,它们都需要一个随机数来做某事。

在这种情况下,我可以将数据成员std::mt19937 mt设为静态并在 cpp 文件中对其进行初始化吗?

class Test {
...
private:
    static std::mt19937 mt;
...
};
// cpp file
std::mt19937 Test::mt((std::random_device())());

我刚试过,它似乎工作。但是不知道是不是有什么问题。

Test t1; t1.func(); t1.func2();
Test t2; t2.func(); t2.func2();

我可以说静态或非静态不会对这段代码造成任何差异吗?

4

1 回答 1

1

我可以说静态或非静态不会对这段代码造成任何差异吗?

如果您关心每个实例Test将观察到的特定数字序列,是的。但是你用 播种这些std::random_device,所以我怀疑你不在乎。

如果您在多个线程上调用这些方法,则静态版本存在数据竞争。我会用thread_local, not static, 分享std::mt19937s。

于 2022-02-25T09:58:26.507 回答