[首先,很抱歉,这是一个愚蠢的问题,但是我最近学习了如何处理课程。我的问题是我创建了一个构造函数,该构造函数使用以下语法为每个数据成员提供一个随机数:
#include <random>
...
//Constructor
cSystem::cSystem(void)
{
//Range of random numbers
double lower_bound = -100;
double upper_bound = 100;
std::uniform_real_distribution<double> unif(lower_bound,upper_bound);
std::default_random_engine re;
/*Initialization of data members*/
sMass=1.0014;
sPositionX= unif(re);
sPositionY= unif(re);
}
但是,我想在我的主要功能中创建这些“系统”的数组
int main (void)
{
cSystem systems[numsist]; //numsist is a constant defined to be 1000
//Function that writes its characteristics in a file using a method that returns positions
getPositions(systems);
return 0;
}
但是在文件中,我刚得到
-73.6924 -8.26997
-73.6924 -8.26997
-73.6924 -8.26997
我以为我正在遍历数组的每个元素的构造函数,给它一个不同的随机值,但是似乎在开始时给出了一个值,然后在整个向量中重复它。我该怎么做才能构造一个以随机方式初始化每个元素的构造函数?
注意:每次运行程序时,我也会得到相同的值,我认为种子没有变化,为什么会这样?
由于每次调用构造函数时都会创建sPositionX
和sPositionY
,因此对于cSystem
的每个实例,您将获得std::uniform_real_distribution<double>
和std::default_random_engine
相同的值。
您需要创建它们一次,然后在构造函数中重复使用它们。一种方法是创建类范围为static
的对象。
struct cSystem
{
...
static std::uniform_real_distribution<double> unif;
static std::default_random_engine re;
};
并且仅在构造函数中使用它们。
这是一个完整的程序。
#include <random>
#include <iostream>
struct cSystem
{
cSystem();
double sPositionX;
double sPositionY;
double sMass;
static std::uniform_real_distribution<double> unif;
static std::default_random_engine re;
};
std::uniform_real_distribution<double> cSystem::unif(-100, 100);
std::default_random_engine cSystem::re;
//Constructor
cSystem::cSystem()
{
/*Initialization of data members*/
sMass=1.0014;
sPositionX= unif(re);
sPositionY= unif(re);
}
void getPositions(cSystem* systems)
{
for (unsigned i = 0; i < 3; ++i )
{
std::cout << systems[i].sPositionX << " " << systems[i].sPositionY << std::endl;
}
}
int main (void)
{
cSystem systems[3];
getPositions(systems);
return 0;
}
我的问题是我创建了一个构造函数,该构造函数为每个数据成员提供了一个随机数
我选择一个特定的PRNG,但默认情况下,它看起来像这样:
std::default_random_engine& prng() {
// seed only one PRNG per thread that needs is:
static thread_local std::default_random_engine gen(std::random_device{}());
return gen;
}
在您在程序中使用的每个分发函数(成员函数或其他函数)中,您现在可以调用prng()
来获取生成器,生成的种子是种子[[once而不是overseeded。