std::random_device
的复制构造函数已删除,我不明白为什么。
我从docs找到的唯一注释是:
2)删除了复制构造函数:
std::random_device
不可复制。
似乎没有明确理由将其删除。这背后的原因是什么?
答案 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;为每个实现生成的数字(只要实现允许)。