C++;对每个新对象使用相同的默认\u随机\u引擎 我是一个C++初学者,来自java和C语言背景。每次创建新对象时,我都尝试使用相同的默认\u随机\u引擎和正态分布。在使用新的default\u random\u引擎之前,我在每个构造函数中使用了一个新的种子和一个新的normal\u分布。我认为这样的正态分布是不正确的
旧代码-> my_object.cpp: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
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”建议。