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

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

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

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

答案

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

另一答案

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

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

以上是关于对象数组的构造函数中的随机数的主要内容,如果未能解决你的问题,请参考以下文章

将数组发送到 JQuery 中的对象构造函数

函数调用或构造函数调用中的 C++ 数组初始化

子类构造函数

是否立即为作为类成员的对象数组调用构造函数?

Python构造函数

在c++中如何调用数组对象的构造函数