为什么std :: random_device将其复制构造函数定义为已删除?

时间:2016-08-09 21:06:58

标签: c++ c++11

std::random_device的复制构造函数已删除,我不明白为什么。

我从docs找到的唯一注释是:

  

2)删除了复制构造函数:std::random_device不可复制。

似乎没有明确理由将其删除。这背后的原因是什么?

1 个答案:

答案 0 :(得分:7)

std::random_device不可复制的原因是,如果是,复制的实例可以返回与原始数字完全相同的数字(虽然这是实现定义的)!

这是因为(docs):

  如果非确定性源(例如,硬件设备)不可用于实现,则可以根据实现定义的伪随机数引擎来实现

std::random_device。在这种情况下,每个std::random_device对象可以生成相同的数字序列。

因此,一些实现将实现PRNG。 PRNG通常使用种子值(以及其他一些状态)来实现,其中"随机"数字生成。通过复制std::random_device,这将复制种子值,以及生成器用于生成随机数的任何其他内部状态(实现定义)。

您将拥有2个随机设备,这些设备具有确定性,因为它们会生成相同的数字序列:

std::random_device device1;
std::random_device device2 = device1; //For demonstration purposes only

std::uniform_int_distribution dis{ 0, 10 };

int randomNumber1 = dis(device1);
int randomNumber2 = dis(device2);
//Note that "randomNumber1 == randomNumber2"! They use exactly the same random number
//generator with the same seed value, etc. -> Same numbers are generated!

实现可能总是为每个std::random_device使用相同的种子值,这意味着每次为不同的随机设备生成相同的数字序列。或者它可能使用一些非确定性来源(取自上面):

  

在这种情况下,每个std::random_device对象可以生成相同的数字序列。

           

[...]如果是非确定性来源(例如硬件设备)[...]

在这些情况下,随机设备是可复制的(并不认为副本实际上是副本)并不重要,但确实在实现生成的位置<使用PRNG的不同随机设备的em>不同的值。

实现复制构造函数(和复制赋值运算符)会破坏使用PRNG的实现的假设,因此将其删除,以保持&#34;随机性&#34;为每个实现生成的数字(只要实现允许)。