Подтвердить что ты не робот

Что происходит, когда вы копируете механизм случайного числа и распределение случайных чисел?

В этом коде:

std::default_random_engine e;
std::default_random_engine e2 = e;                        //1
std::default_random_engine e3(e2);                        //2
std::default_random_engine e4(std::move(e3));             //3

std::uniform_real_distribution<double> d(0,1);
std::uniform_real_distribution<double> d2 = d;            //4
std::uniform_real_distribution<double> d3(d2);            //5
std::uniform_real_distribution<double> d4(std::move(d3)); //6

Можете ли вы объяснить, что именно происходит в каждом из случаев с 1 по 6? Я не вижу назначения копии, копирования конструкции и перемещения конструкции для этих классов документально где-нибудь.

В частности: Когда мы создаем новый движок/дистрибутив от другого, делает ли он reset или , где он остановился?

4b9b3361

Ответ 1

Когда вы копируете движок или дистрибутив, гарантируется, что оба двигателя (или распределения) будут генерировать одну и ту же последовательность значений с этой точки.

Для двигателей стандарт требует, чтобы E (x) создавал двигатель, который сравнивается с x (26.5.1.4, таблица 117). Двигатели сравниваются одинаково, если бесконечная последовательность будущих вызовов к движку выдаст те же значения (26.5.1.4).

Для распределений они требуются (26.5.1.6p4) для удовлетворения требований CopyConstructible (таблица 21). Это требует, чтобы созданный объект был эквивалентен оригиналу. Требование к распределению, сравнивающемуся как равное (26.5.1.6, таблица 118), состоит в том, что они имеют одинаковые параметры, а будущая последовательность генерируемых значений (при использовании эквивалентных двигателей) одинакова.