热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

篇首语:本文由编程笔记#小编为大家整理,主要介绍了对象数组的构造函数中的随机数相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了对象数组的构造函数中的随机数相关的知识,希望对你有一定的参考价值。



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

#include

...

//Constructor
cSystem::cSystem(void)
//Range of random numbers
double lower_bound = -100;
double upper_bound = 100;
std::uniform_real_distribution 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_distributionstd::default_random_engine相同的值。

您需要创建它们一次,然后在构造函数中重复使用它们。一种方法是创建类范围为static的对象。

struct cSystem
...
static std::uniform_real_distribution unif;
static std::default_random_engine re;
;

并且仅在构造函数中使用它们。

这是一个完整的程序。

#include
#include <iostream>
struct cSystem
cSystem();
double sPositionX;
double sPositionY;
double sMass;
static std::uniform_real_distribution unif;
static std::default_random_engine re;
;
std::uniform_real_distribution 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 <
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


推荐阅读
author-avatar
起五贪黑_719
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有