默认构造函数设置随机值

Default constructor setting random value

我正在为 atoms 对象编写一个简单的 class。这是我到目前为止所写的内容:

#include <random>

class Atom {
    int mSpin;

public:
    Atom();
    Atom(int);
    Atom(const Atom&);
    ~Atom() {}

    Atom& operator= (const Atom &atom);
};

和 .cpp 文件:

include "Atom.h"

Atom::Atom() {
}
Atom::Atom(int spin) : mSpin(spin) {}
Atom::Atom(const Atom& copy) : mSpin(copy.mSpin) {}

/*  OPERATORS  */

Atom& Atom::operator= (const Atom &copy) {
    mSpin = copy.mSpin;
    return *this;
}

我想创建默认构造函数,以便在创建对象时将 mSpin 随机设置为 1 或 -1。我知道如何用 rand() 来做,但是 rand() 不是很好,我想使用 .即使在阅读了此处的文档和其他答案之后,我也对 的使用感到困惑。 通常我会这样做:

#include <random>
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0,1);
int random_number = dis(gen);

但我不确定如何在 class 中使用它。我尝试将它放在默认构造函数中,但我认为这是错误的,因为每次我创建原子时它都会播种?

希望问题很清楚。

您应该使随机设备和生成器成为 Atom 的静态成员 class。这样,就像全局变量一样,它们在程序运行期间只初始化一次。

class Atom {
  // declaration
  static std::random_device rd;
  static std::mt13397 gen;

  ...
};

// definition - this must be in Atom.cpp
std::random_device Atom::rd;
std::mt13397 Atom::gen(Atom::rd());

您可以委托给 cpp 文件中的函数:

namespace {                                                                                                                                                  
    random_device rd;                                                                                                                                            
    mt19937 gen(rd());                                                                                                                                           
    uniform_int_distribution<> dis(0,1);                                                                                                                                                                                                                                                                                 
}                                                                                                                                                            
int spin() {                                                                                                                                                                                                                                                                                                              
    return dis(gen) == 0 ? -1 : 1;                                                                                                                           
}                                                                                                                                                             

删除默认 CTOR 的实现。

并遵循规则 'initialise all variables' 更改 Atom.hpp:

int spin(); // Return -1 or 1, randomly

class Atom {
    int mSpin = spin();
public:
    Atom() = default;
    ...
};

然后,在您的 cpp 文件中,删除您的 Atom 默认 CTOR 实现并将 'spin' 函数定义移出匿名命名空间。