对象副本:复制随机引擎的正确方法

时间:2016-01-26 14:16:31

标签: c++ random

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

我的问题是:当我使用operator =:

时,引擎会发生什么
Proc A; 
// operations on A 
Proc B;
B=A;

它会为B随机初始化创建一个新引擎吗?或者它会创建一个引擎,从A的引擎停止生成伪随机数?

以下是我写课程的方法:

class Proc {
  public:
mt19937 eng {random_device{}()};
double Tps;
vector<int> prc;
... }

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

搜索隐式复制构造函数

  

隐含的   复制构造函数执行源对象的成员副本

Copy constructors

答案 1 :(得分:0)

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

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

另一种可能性是所有实例共享的private static thread_local生成器。这将摆脱播种问题,可能是最好的解决方案。