C++ 复制对象:复制随机引擎的正确方法

C++ 复制对象:复制随机引擎的正确方法,c++,random,C++,Random,我编写了一个生成随机进程的cpp类。 我将随机引擎定义为类的公共属性 我的问题是:当我使用操作符=: Proc A; // operations on A Proc B; B=A; 它会为B创建一个随机初始化的新引擎吗?或者它会创建一个引擎,从一台机器的引擎停止的地方生成伪随机数 下面是我如何写这门课的: class Proc { public: mt19937 eng {random_device{}()}; double Tps; vector<int> prc; ..

我编写了一个生成随机进程的cpp类。 我将随机引擎定义为类的公共属性

我的问题是:当我使用操作符=:

Proc A; 
// operations on A 
Proc B;
B=A;
它会为B创建一个随机初始化的新引擎吗?或者它会创建一个引擎,从一台机器的引擎停止的地方生成伪随机数

下面是我如何写这门课的:

class Proc {
  public:
mt19937 eng {random_device{}()};
double Tps;
vector<int> prc;
... }
类进程{
公众:
mt19937 eng{random_设备{}()};
双Tps;
向量prc;
... }

谢谢你的帮助

搜索隐式复制构造函数

含蓄的 复制构造函数执行源对象的成员级复制


默认的复制赋值运算符(以及默认的复制构造函数)将只复制整个
mt19937
及其所有内部状态,因此两个实例将获得相同的随机数序列

一种解决方案是通过设计合适的赋值运算符和副本构造函数在每个副本上重新设定种子。这可能需要一些时间,如果你做了很多拷贝,尤其是如果你真的想每次都产生一个19937位的种子


另一种可能是所有实例共享的
私有静态线程\u local
生成器。这将消除种子问题,可能是最好的解决方案。

您是否为类定义了
操作符=
,还是使用默认操作符?默认赋值操作符将复制mersenne twister成员的状态,从那时起,它将提供相同的随机数序列。可能会重复感谢您的帮助。我的第一个想法实际上是将我的引擎声明为本地引擎。我想写一些东西,比如:“staticm19937 eng{…}”,作为类Proc的一个属性。但是它没有编译。你能告诉我如何在我的类中将引擎声明为静态的吗?谢谢实际上,你所说的“两个实例将得到相同的随机数序列”是什么意思。当我做一些测试,比如A=B;cout@CômeHuré无法重现这一点。分布并没有改变这一点@你的第一句话是:这很奇怪。我在mac和linux服务器上复制并编译了您的cpp:在两次执行输出期间,断言都失败了。