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

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

我想做一个简单的方法来获取随机数,但是,gen,随机数生成器似乎在函数之间丢失了它的种子。如果多次运行此示例,您会发现每次运行生成的第一个随机数都是随机的,而第二个则不是。这是什么原因?

主要.cpp

#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;
}

随机.hpp

#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;

};

随机.cpp

#include "Random.hpp"
#include <time.h>
std::default_random_engine Random::gen;
std::uniform_int_distribution<int> Random::ints;
void Random::seed()
{
    gen.seed(static_cast<unsigned int>(time(NULL)));
}
int Random::getRandom(int minInclusive, int maxInclusive)
{
    std::uniform_int_distribution<int>::param_type range(minInclusive, maxInclusive);
    ints.param(range);
    return ints(gen);
}

最佳答案

您显示的代码似乎依赖于 random.cpp 中的静态范围对象在 main.cpp 中的静态范围对象之前实例化.

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

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

main.cpp 之后的静态对象被实例化,random.cpp的静态对象被实例化,从而将它们重置为使用默认种子值。

关于c++ - 静态随机数生成器丢失全局变量的种子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36119190/

相关文章:

c++ - 我可以重复使用 QPainter 吗?

javascript - 使用播种的随机颜色生成器时过滤某些颜色

python - 使用 pandas 使用现有数据框中的唯一元素生成随机数据框

c++ - boost 中的 linear_congruential 库

ios - 在 XCode 上为 iOS 使用自定义构建的 OpenCV 会产生 ___sincos_stret undefined symbol

php - 如何通过静态方法在其父类中使用子类中的静态变量

java - Java嵌套静态类

c++ - std::vector 初始化类成员

c++ - 为什么QByteArray中没有deleteLater?

c++ - 我该怎么做才能不使用 !openFile.eof()?