C++;对每个新对象使用相同的默认\u随机\u引擎 我是一个C++初学者,来自java和C语言背景。每次创建新对象时,我都尝试使用相同的默认\u随机\u引擎和正态分布。在使用新的default\u random\u引擎之前,我在每个构造函数中使用了一个新的种子和一个新的normal\u分布。我认为这样的正态分布是不正确的

C++;对每个新对象使用相同的默认\u随机\u引擎 我是一个C++初学者,来自java和C语言背景。每次创建新对象时,我都尝试使用相同的默认\u随机\u引擎和正态分布。在使用新的default\u random\u引擎之前,我在每个构造函数中使用了一个新的种子和一个新的normal\u分布。我认为这样的正态分布是不正确的,c++,random,static,normal-distribution,C++,Random,Static,Normal Distribution,旧代码-> my_object.cpp: default_random_engine generator; MyObject() { double mean = 1.0; double std = 0.5; normal_distribution<double> distribution(mean, std); QTime time = QTime::currentTime(); uint milli = (time.hour() * 60

旧代码->

my_object.cpp:

default_random_engine generator;

MyObject() {
    double mean = 1.0;
    double std = 0.5;
    normal_distribution<double> distribution(mean, std);
    QTime time = QTime::currentTime();
    uint milli = (time.hour() * 60 * 60 * 1000) + (time.minute() * 60 * 1000) + (time.second() * 1000) + time.msec();
    generator.seed(milli);
    myValue = distribution(generator);
}
default_random_engine generator;
normal_distribution<double> distribution;

MyObject() {
    myValue = distribution(generator);
}
我做错了什么?为什么我会出错?我之前的正态分布/随机生成是不正确的,对吗?我能用这种方法生成所需的正态分布吗?

其中一个问题是

distribution(mean, std);
这句话不符合你的想法。要设置分布参数,请使用函数,如

distribution.param(std::normal_distribution<double>(mean,std).param());
另外,看起来您的
发行版
类Main
中是一个静态对象,但是您随后在
.cpp
文件中定义了另一个。如果您只想对第一个进行ODR,请使用

normal_distribution<double> Main::distribution;
正态分布Main::分布;
相反,然后使用
Main::distribution
而不是
distribution
。发动机也是如此。

其中一个问题是

distribution(mean, std);
这句话不符合你的想法。要设置分布参数,请使用函数,如

distribution.param(std::normal_distribution<double>(mean,std).param());
另外,看起来您的
发行版
类Main
中是一个静态对象,但是您随后在
.cpp
文件中定义了另一个。如果您只想对第一个进行ODR,请使用

normal_distribution<double> Main::distribution;
正态分布Main::分布;

相反,然后使用
Main::distribution
而不是
distribution
。发动机也是如此。

我想,在这里的其他答案的帮助下,我找到了问题的解决方案。我在“Main”中创建并初始化默认的随机引擎、正态分布和随机设备,并在“MyClass”中使用extern关键字。如果我没有错,每次创建一个新的“MyClass”对象时,它都应该使用相同的随机生成器,这样我就可以得到我想要的正态分布

Main.cpp

#include "Main.h"
#include "MyClass.h"

#include <iostream>
#include <random>

using namespace std;

normal_distribution<double> distribution;
default_random_engine engine;
random_device rd;

int main(int argc, char *argv[]) {
    double mean = 1.0;
    double std = 0.5;
    distribution.param(std::normal_distribution<double>(mean, std).param());
    engine.seed(rd());
    MyClass obj = MyClass();        
    return 0;
}
MyClass.cpp:

#include "MyClass.h"

#include <random>

using namespace std;

extern default_random_engine engine;
extern normal_distribution<double> distribution;

MyClass::MyClass()
{
    value = distribution(engine);
}
#包括“MyClass.h”
#包括
使用名称空间std;
外部默认随机引擎;
外正态分布;
MyClass::MyClass()
{
值=分配(发动机);
}

我想在这里的其他答案的帮助下,我找到了问题的解决方案。我在“Main”中创建并初始化默认的随机引擎、正态分布和随机设备,并在“MyClass”中使用extern关键字。如果我没有错,每次创建一个新的“MyClass”对象时,它都应该使用相同的随机生成器,这样我就可以得到我想要的正态分布

Main.cpp

#include "Main.h"
#include "MyClass.h"

#include <iostream>
#include <random>

using namespace std;

normal_distribution<double> distribution;
default_random_engine engine;
random_device rd;

int main(int argc, char *argv[]) {
    double mean = 1.0;
    double std = 0.5;
    distribution.param(std::normal_distribution<double>(mean, std).param());
    engine.seed(rd());
    MyClass obj = MyClass();        
    return 0;
}
MyClass.cpp:

#include "MyClass.h"

#include <random>

using namespace std;

extern default_random_engine engine;
extern normal_distribution<double> distribution;

MyClass::MyClass()
{
    value = distribution(engine);
}
#包括“MyClass.h”
#包括
使用名称空间std;
外部默认随机引擎;
外正态分布;
MyClass::MyClass()
{
值=分配(发动机);
}

您应该能够使用与发行版构造函数相同的参数构造一个
参数类型。所以类似的东西也应该起作用-
distribution.param(decltype(distribution)::param_type(mean,std))@Praetorian谢谢,我不知道这条捷径。它确实有效,只是经过测试。您应该能够使用与发行版构造函数相同的参数构造
param_type
。所以类似的东西也应该起作用-
distribution.param(decltype(distribution)::param_type(mean,std))@Praetorian谢谢,我不知道这条捷径。它确实有效,刚刚测试过。我消除了“distribution.param(std::normal_distribution(mean,std.param())”的错误。我只是不明白为什么它在我的旧代码中与“分布(平均值,std)”一起工作。我发布了我的问题的答案,我猜代码算作SSCCE。在你的旧代码中,你正在初始化一个新的
正态分布
对象-
正态分布(平均值,std)调用构造函数。在新代码中,您已经构建了一个全局
正态分布
实例,然后是
分布(mean,std)调用重载,但参数类型错误,导致错误。非常感谢您的解释!现在我明白了为什么它不起作用了。我消除了“distribution.param(std::normal_distribution(mean,std.param())”的错误。我只是不明白为什么它在我的旧代码中与“分布(平均值,std)”一起工作。我发布了我的问题的答案,我猜代码算作SSCCE。在你的旧代码中,你正在初始化一个新的
正态分布
对象-
正态分布(平均值,std)调用构造函数。在新代码中,您已经构建了一个全局
正态分布
实例,然后是
分布(mean,std)调用重载,但参数类型错误,导致错误。非常感谢您的解释!现在我明白了为什么它不起作用了。除非你真的需要一个全局的
random\u设备
实例,否则我会去掉它,使用
engine.seed(std::random\u设备{}())
您还应该使用
使用名称空间std你说得对,我只需要随机_设备一次,这样我就可以按你的方式来做。谢谢你对“namespace std”的建议。除非你真的需要一个全局
random\u设备
实例,否则我会去掉它,使用
engine.seed(std::random\u设备{}())
您还应该使用
使用名称空间std你说得对,我只需要随机_设备一次,这样我就可以按你的方式来做。谢谢你的“名称空间std”建议。