2

我不确定我在标题中使用了正确的术语,但这是我想要做的:

我有一个轻量级粒子类(简化),它需要随机行为来进行出生和墙壁碰撞。我想在课堂上保留这些设施。据我了解,静态成员只创建一次,并且可以在类的所有实例之间共享。

对于随机数生成器对象,我想调用一次种子方法,但不确定如何执行此操作,因为大多数示例使用纯静态变量或函数。

粒子.h:

#include <random>

class Particle
{
    public:
        Particle();
    private:
        static std::default_random_engine pRNG;
        static std::uniform_real_distribution<> dist(0, 1);
};

粒子.cpp

#include "particle.h"
#include <ctime>

std::default_random_engine Particle::pRNG.seed(time(NULL)); // <- wrong, help!

Particle::Particle() {}

// methods, etc.

种子方法放入 Particle 构造函数会在我想的每个出生的粒子上调用它。我能想到的唯一快速破解是在 Particle 类中添加一个 bool 成员,在第一次种子调用时将其设置为 false。

4

3 回答 3

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;
};
于 2013-06-21T17:12:25.203 回答
0

std::default_random_engine 粒子::pRNG.seed(time(NULL)); // <- 错误,求助!

这很好,除了它在错误的地方。它应该在代码块内,某种上下文。我建议将此设施分离到一个单例类中,该类将被称为随机数。否则,您将不得不从课堂外的某个地方调用它。

在构造函数中调用它会导致多次调用,这不是您想要的,或者如果您想从类中调用它 - 添加一个静态标志以标记它已被播种以确保您只调用它一次。

于 2013-06-21T17:12:36.773 回答
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{};
于 2013-06-21T17:14:21.770 回答