对象数组的构造函数中的随机数

问题描述 投票:1回答:2

[首先,很抱歉,这是一个愚蠢的问题,但是我最近学习了如何处理课程。我的问题是我创建了一个构造函数,该构造函数使用以下语法为每个数据成员提供一个随机数:

#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

我以为我正在遍历数组的每个元素的构造函数,给它一个不同的随机值,但是似乎在开始时给出了一个值,然后在整个向量中重复它。我该怎么做才能构造一个以随机方式初始化每个元素的构造函数?

注意:每次运行程序时,我也会得到相同的值,我认为种子没有变化,为什么会这样?

c++ arrays class random constructor
2个回答
0
投票

由于每次调用构造函数时都会创建sPositionXsPositionY,因此对于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


0
投票

我的问题是我创建了一个构造函数,该构造函数为每个数据成员提供了一个随机数

  • 当您将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

© www.soinside.com 2019 - 2024. All rights reserved.