随机数类内初始化

Jam*_*ens 3 c++ random initialization c++11

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

private:
    unsigned random = rand() % 10;
Run Code Online (Sandbox Code Playgroud)

但是,我想使用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);
Run Code Online (Sandbox Code Playgroud)

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

Pra*_*ian 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);
Run Code Online (Sandbox Code Playgroud)

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

实例

  • 我会将静态数据成员封装到静态成员函数中,以避免需要单独的类外定义,[如此.](http://coliru.stacked-crooked.com/a/64c9a61056da2e03)链接器做的工作;) (4认同)