复制构造函数std::random_device被删除,我不明白为什么.
我从文档中找到的唯一注释是:
2)复制构造函数被删除:
std::random_device不可复制.
似乎没有明确的理由将其删除.这背后的原因是什么?
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的实现的假设,因此将其删除,以维护为每个实现生成的数字的"随机性"(只要实现允许它) ).