默认构造函数设置随机值
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 ©) {
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' 函数定义移出匿名命名空间。
我正在为 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 ©) {
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' 函数定义移出匿名命名空间。