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

Rak*_*111 7 c++ c++11

复制构造函数std::random_device被删除,我不明白为什么.

我从文档中找到的唯一注释是:

2)复制构造函数被删除:std::random_device不可复制.

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

Rak*_*111 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!
Run Code Online (Sandbox Code Playgroud)

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

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


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

在这些情况下,随机设备是可复制的并不重要(人们不会认为副本实际上是副本),但是实现在哪里使用PRNG为不同的随机设备生成不同的确实很重要.

实现复制构造函数(以及复制赋值运算符)将破坏使用PRNG的实现的假设,因此将其删除,以维护为每个实现生成的数字的"随机性"(只要实现允许它) ).