gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:31:02 55 4
gpt4 key购买 nike

std::random_device 的拷贝构造函数被删除了,我不知道为什么。

我从 docs 中找到的唯一笔记是:

2) The copy constructor is deleted: std::random_device is not copyable.

似乎没有明确的理由说明为什么要删除它。这背后的原因是什么?

最佳答案

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

这是因为(docs):

std::random_device may be implemented in terms of an implementation-defined pseudo-random number engine if a non-deterministic source (e.g. a hardware device) is not available to the implementation. In this case each std::random_device object may generate the same number sequence.

一些实现将因此实现 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 使用相同的种子值,这意味着每次都会为不同的随机设备生成相同的数字序列。或者它可能使用一些不确定的来源(从上面获取):

In this case each std::random_device object may generate the same number sequence.


[...] if a non-deterministic source (e.g a hardware device) [...]

在那些情况下,随机设备是否可复制并不重要(人们不会认为该拷贝实际上是一个拷贝),但它确实重要的是实现在何处生成使用 PRNG 的不同随机设备的不同值。

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

关于c++ - 为什么 std::random_device 将其复制构造函数定义为已删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38860439/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com