将 mt19937 设为静态 class 是正确的
It is proper to make mt19937 static in a class
假设我有一个 class 如下:
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();
我能说静态或非静态不会对这段代码造成任何差异吗?
Can I say that static or non-static won't cause any difference for the piece of code?
如果您关心 Test
的每个实例将观察到的特定数字序列,是的。然而,你用 std::random_device
播种这些,所以我怀疑你不关心那个。
如果您在多个线程上调用这些方法,则静态版本会出现数据争用。我会使用 thread_local
而不是 static
来分享 std::mt19937
s.
假设我有一个 class 如下:
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();
我能说静态或非静态不会对这段代码造成任何差异吗?
Can I say that static or non-static won't cause any difference for the piece of code?
如果您关心 Test
的每个实例将观察到的特定数字序列,是的。然而,你用 std::random_device
播种这些,所以我怀疑你不关心那个。
如果您在多个线程上调用这些方法,则静态版本会出现数据争用。我会使用 thread_local
而不是 static
来分享 std::mt19937
s.