使用随机值初始化静态成员

时间:2015-11-22 02:29:07

标签: c++ random static polymorphism

class A{
        int a;
    public:
        A(int inA = 0);
        int getA;
    protected:
        void setA(int inA);
    };
A::A(int inA)
    {
        setA(inA)
    }
void A::setA(int inA){
        //need to set a as static random number
        a = inA;
    }
int A::getA()const
    {
        return a;
    }

我怎么可能使用静态成员生成一个随机的?我在网上看过类似的内容:Random Number In-Class Initialisation但不确定如何使用它。

1 个答案:

答案 0 :(得分:1)

最简单的方法可能是创建PRNG类的全局实例。

std::uniform_int_distribution<int> dist;
std::mt19937 rng((std::random_device()()));

struct foo
{
    static int bar;
};

int foo::bar = dist(rng);

当然,将全局对象和初始化放在.cpp文件中(感谢@AnonMail!)。

使用旧(坏)随机数设施,您可以使用:

int foo::bar = (srand(time(0)), rand());

这也不是很好,因为你秘密播种srand这有点奇怪,rand很糟糕。

(可以说)有趣的方法是这样做:

int foo::bar = []() {std::uniform_int_distribution<int> dist; std::mt19937 mt((std::random_device()())); return dist(mt); }();

使用lambda创建变量并返回值,消除额外的对象并将其全部放在一行上。

我意识到我以为我以前没见过像这样使用过的lambda,所以我不确定它是否会起作用。我的编译器看起来很好,它按预期运行,所以我的假设是正确的。