对象数组的构造函数中的随机数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象数组的构造函数中的随机数相关的知识,希望对你有一定的参考价值。
[首先,很抱歉,这是一个愚蠢的问题,但是我最近学习了如何处理课程。我的问题是我创建了一个构造函数,该构造函数使用以下语法为每个数据成员提供一个随机数:
#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;
[请参阅https://ideone.com/bS8E4u。
另一答案
我的问题是我创建了一个构造函数,该构造函数为每个数据成员提供了一个随机数
- 当您将PRNG设置为默认构造时,您不会播种PRNG。每次都会以其默认状态开始。
- PRNG不应该由任何one类拥有。播种是昂贵的,并且应该由需要生成随机数的所有函数(每个线程)共享-将其与任何类分开。
我选择一个特定的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。
以上是关于对象数组的构造函数中的随机数的主要内容,如果未能解决你的问题,请参考以下文章