首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使mt19937在类中保持静态是正确的

使mt19937在类中保持静态是正确的
EN

Stack Overflow用户
提问于 2022-02-25 09:18:56
回答 1查看 103关注 0票数 0

假设我有一节课如下:

代码语言:javascript
复制
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文件中初始化它吗?

代码语言:javascript
复制
class Test {
...
private:
    static std::mt19937 mt;
...
};
// cpp file
std::mt19937 Test::mt((std::random_device())());

我刚试过了,看起来很管用。但我不知道是不是出了什么问题。

代码语言:javascript
复制
Test t1; t1.func(); t1.func2();
Test t2; t2.func(); t2.func2();

我可以说静态或非静态不会导致代码段的任何不同吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-25 09:58:26

--我可以说静态的还是非静态的-不会对代码造成任何不同吗?

如果您关心Test的每个实例都会观察到的特定的数字序列,是的。但是,您使用的是std::random_device,因此我怀疑您并不关心这一点。

如果在多个线程上调用这些方法,则静态版本会进行数据竞争。我会使用thread_local而不是static来共享std::mt19937

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71263597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档