静态随机数生成器丢失全局变量的种子

时间:2016-03-20 20:33:45

标签: c++ random static static-methods static-members

我想用一种简单的方法来获取一个随机数,但是,gen,随机数生成器似乎在函数中丢失了它的种子。如果多次运行此示例,您将看到生成的第一个随机数是每次运行的随机数,而第二个则不是。造成这种情况的原因是什么?

的main.cpp

TOP

Random.hpp

#include <iostream>
#include "Random.hpp"
class Global
{
public:
    Global()
    {
        Random::seed();
        std::cout << "\n" << Random::getRandom(-10, 10);//random
    }
    void Global::doStuff()
    {
        std::cout << "\n" << Random::getRandom(-10, 10);//not random
    }
};
Global globalInstance;

int main()
{
    globalInstance.doStuff();
    return 0;
}

Random.cpp

#pragma once
#include <random>
class Random
{
public:

    static void seed();
    static int getRandom(int minInclusive, int maxInclusive);

private:
    static std::default_random_engine gen;
    static std::uniform_int_distribution<int> ints;

};

1 个答案:

答案 0 :(得分:1)

您显示的代码似乎依赖random.cppmain.cpp中静态作用的对象在main.cpp中的静态作用域对象之前的实例化。

这是未定义的行为。 C ++标准不保证来自不同翻译单元的静态作用对象的相对实例化顺序。

似乎正在发生的事情是,您的实现首先实例化random.cpp的静态对象,它会在main.cpp翻译中定义的对象中设置随机种子单元。这本身就包含了未定义的行为,但是这个操作看起来似乎没有崩溃。

random.cpp的静态对象被实例化后,foreach ($uniques as $unique) {的静态对象被实例化,从而重置它们以使用默认的种子值。