我想用一种简单的方法来获取一个随机数,但是,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;
};
答案 0 :(得分:1)
您显示的代码似乎依赖random.cpp
中main.cpp
中静态作用的对象在main.cpp
中的静态作用域对象之前的实例化。
这是未定义的行为。 C ++标准不保证来自不同翻译单元的静态作用对象的相对实例化顺序。
似乎正在发生的事情是,您的实现首先实例化random.cpp
的静态对象,它会在main.cpp
翻译中定义的对象中设置随机种子单元。这本身就包含了未定义的行为,但是这个操作看起来似乎没有崩溃。
在random.cpp
的静态对象被实例化后,foreach ($uniques as $unique) {
的静态对象被实例化,从而重置它们以使用默认的种子值。