当我有一个需要随机数生成器的程序时,我使用这个类,以便整个程序可以在相同的rng上运行。
#include <random>
#include <ctime>
using namespace std;
class Rizzian {
private:
static mt19937 mt;
public:
void initialize() {
mt.seed(unsigned(time(NULL)));
}
unsigned int r() {
return mt();
}
};
这要求以下行出现在代码的其他地方(在任何函数或类定义之外):
mt19937 Rizzian::mt = mt19937();
当初始化rng并且我有变量Rizzian rng
时,我会得到rng.r()
的随机数。
但是在Rizzian的定义之外还有一条额外的线条让我感觉好像有更好的方法可以做到这一点,而且一般来说,一个静态变量的整个类感觉就像是矫枉过正。所以这对我来说只是一种预感。这里有点臭。
这不是关于rngs或mersenne twisters或任何事情的具体问题。是否有更好的方法来制作整个程序可以访问的静态变量?
答案 0 :(得分:4)
没有必要为这个功能上课。函数也可以包含静态成员。带有static关键字的行只执行一次。
#include <random>
#include <ctime>
#include <iostream>
using namespace std;
unsigned int rnd()
{
static bool first_call = true;
static mt19937 mt = mt19937();
if (first_call)
{
mt.seed(unsigned(time(NULL)));
first_call = false;
}
return mt();
}
int main()
{
unsigned int r = rnd();
std::cout << r << std::endl;
for (int i=1; i<10; i++)
{
r = rnd();
std::cout << r << std::endl;
}
}