std :: default_random_engine即使更改种子也会生成相同的值?

Inv*_*dre 7 c++ random visual-studio-2013

我正在尝试实现一个类,将其用作随机库的包装器,以便在代码的其他地方(我认为)可以更直观地使用其对象和函数。

在标头中,我有类似以下内容:

class RandomDevice{
private:
    unsigned long rand_seed;
    default_random_engine engine;
public:
    RandomDevice(unsigned long n);
    int randInt(int min, int max);};
Run Code Online (Sandbox Code Playgroud)

然后在.cpp文件中,我实现了这两个函数(构造函数和randInt),如下所示:

RandomDevice::RandomDevice(unsigned long n){
    rand_seed = n;
    default_random_engine engine;
    engine.seed(n);
}

int RandomDevice::randInt(int min, int max){
    uniform_int_distribution<int> distribution(min, max);
    return distribution(engine);
}
Run Code Online (Sandbox Code Playgroud)

最后,在main.cpp中,我将像下面这样测试这些功能:

int main(){
    unsigned long seed = 1;
    RandomDevice my_rand(seed);

    cout << "random integer: " << my_rand.randInt(0, 10) << endl;
}
Run Code Online (Sandbox Code Playgroud)

问题是,无论我在main.cpp中将种子设置为什么,我总是为随机数获得相同的值(不仅是randInt,我还有其他分布)。我也尝试将种子设置为time(NULL),但发生相同的问题。

我真的很head头。谢谢!

T.C*_*.C. 7

default_random_engine engine;
engine.seed(n);
Run Code Online (Sandbox Code Playgroud)

这为local植入了种子,该local engine在构造函数的末尾销毁,而不是在class member处销毁,该类engine最终被默认构造。

请使用成员初始化器列表:

RandomDevice::RandomDevice(unsigned long n) : rand_seed(n), engine(n){ }
Run Code Online (Sandbox Code Playgroud)


小智 6

尝试使用std ::计时喂种子在每个迭代或每次呼叫。我认为播种时刻会提供最佳的随机性,因为每个时刻都是唯一的种子,没有任何重复。我将执行以下操作:

#include <chrono> 
...
default_random_engine engine; // or any other engine
engine.seed(std::chrono::system_clock::now().time_since_epoch().count());
Run Code Online (Sandbox Code Playgroud)