我不确定我的标题中是否使用了正确的术语,但这就是我要做的事情:
我有一个轻量级粒子类(简化),需要出生和墙碰撞的随机行为。我想在课堂上保留这些设施。据我所知,静态成员只创建一次,并且可以在类的所有实例之间共享。
对于随机数生成器对象,我想调用种子方法一次,但不确定如何执行此操作,因为大多数示例使用普通的静态变量或函数。
Particle.h:
#include <random>
class Particle
{
public:
Particle();
private:
static std::default_random_engine pRNG;
static std::uniform_real_distribution<> dist(0, 1);
};
Particle.cpp
#include "particle.h"
#include <ctime>
std::default_random_engine Particle::pRNG.seed(time(NULL)); // <- wrong, help!
Particle::Particle() {}
// methods, etc.
将种子方法放入Particle构造函数中,我会在每个生成的粒子上调用它。我能想到的唯一快速入侵是将一个bool成员添加到Particle类中,在第一次种子调用时将其设置为false。
答案 0 :(得分:0)
执行此操作的简单方法:创建一个名为“AutoInitRNG”的类,该类在其构造函数中播种default_random_engine
。并使该类成为Particle的静态成员变量。像这样:
class AutoInitRNG
{
public:
std::default_random_engine pRNG;
AutoInitRNG()
{
pRNG.seed(time(NULL));
}
};
class Particle
{
//...
private:
static AutoInitRNG RNG;
};
答案 1 :(得分:0)
std :: default_random_engine Particle :: pRNG.seed(time(NULL)); //&lt; - 错误,帮助!
这是完全没问题,除了它在错误的地方。它应该在代码块内,某种上下文。我建议将此工具分离为单个类,这将被称为随机数。否则,你必须在某个地方以外的地方叫它。
在构造函数中调用它会导致多次调用,这不是您想要的,或者如果您想从类中调用它 - 添加一个静态标记以标记它已被播种以确保您只调用它一次。
答案 2 :(得分:0)
您希望在构建seed
之后调用Particle::pRNG
,并且只需调用一次。具有静态存储持续时间的任何内容都只初始化一次。如果静态存储持续时间和动态初始化的两个定义在同一个转换单元中,它们将始终按该顺序初始化(并以相反的顺序销毁)。
所以你需要的只是第二个定义。诀窍是制作一些东西,以便你可以定义它。
// In header:
class Particle {
// ...
private:
static std::default_random_engine pRNG;
class RNG_Setup_;
friend class Particle::RNG_Setup_;
};
// In source:
std::default_random_engine Particle::pRNG;
class Particle::RNG_Setup_ {
RNG_Setup_() { Particle::pRNG.seed(time(nullptr)); }
static RNG_Setup_ setup_instance;
};
Particle::RNG_Setup_::setup_instance{};