随机数类内初始化

时间:2014-03-18 19:40:34

标签: c++ c++11 random initialization

我正在创建一个类,我希望每次创建对象时,其中一个私有成员都会使用随机数进行初始化。以下代码没有问题:

private:
    unsigned random = rand() % 10;
但是,我想使用C ++ 11随机引擎和发行版来做到这一点。我希望能够按照以下代码的方式做一些事情,这些代码将无法编译,但会对我正在尝试做的事情有一个大概的了解:

private:
unsigned random = distribution(mersenne_generator(seed));

static std::random_device seed_generator;
static unsigned seed = seed_generator(); //So that it's not a new seed each time.
static std::mt19937 mersenne_generator;
static std::uniform_int_distribution<unsigned> distribution(0, 10);

此代码无法编译,因为我正在尝试定义类中的一些静态成员。但是,我不确定在哪里定义它们。我可以创建一个初始化所有内容的成员函数,但是我必须在main中运行它,我不想这样做。我想整理出类中的所有随机定义,这样当我在main中创建一个对象时,它将隐式创建随机数。有什么建议吗?

1 个答案:

答案 0 :(得分:8)

您需要在类定义之外定义静态数据成员。例如,这将起作用:

struct foo
{
private:
    unsigned random = distribution(mersenne_generator);    
    static std::random_device seed_generator;
    static unsigned seed;
    static std::mt19937 mersenne_generator;
    static std::uniform_int_distribution<unsigned> distribution;
};

std::random_device foo::seed_generator;
unsigned foo::seed = seed_generator();
std::uniform_int_distribution<unsigned> foo::distribution(0, 10);
std::mt19937 foo::mersenne_generator(foo::seed);

静态数据成员的定义应放在.cpp文件中,否则您可能会违反一个定义规则。

Live example