2013-06-04 4 views
17

In diesem Code:Was passiert, wenn Sie eine Zufallszahl-Engine und Zufallszahlenverteilung kopieren?

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 

Können Sie erklären, was genau in jedem der Fälle 1 bis 6 passiert? Ich sehe die Kopieraufgabe, die Konstruktion und die Konstruktion für diese dokumentierten Klassen nirgends.

Insbesondere gilt: Wenn wir einen neuen Motor/Verteilung von einem anderen erstellen, wird es zurückgesetzt oder weitermachen, wo sie ab links?

Antwort

12

Wenn Sie eine Engine oder Distribution kopieren, wird garantiert, dass beide Engines (oder Verteilungen) ab diesem Zeitpunkt die gleiche Sequenz von Werten generieren.

Für Motoren erfordert der Standard, dass E (x) eine Engine erzeugt, die gleich mit x (26.5.1.4, Tabelle 117) vergleicht. Engines vergleichen gleich, wenn die unendliche Folge zukünftiger Aufrufe an die Engine dieselben Werte erzeugt (26.5.1.4).

Für Verteilungen sind sie erforderlich (26.5.1.6p4), um die Anforderungen von CopyConstructible zu erfüllen (Tabelle 21). Dies erfordert, dass das erstellte Objekt dem Original entspricht. Die Anforderung für Verteilungen, die als gleichwertig (26.5.1.6, Tabelle 118) vergleichen, besteht darin, dass sie die gleichen Parameter haben und die zukünftige Folge der generierten Werte (wenn äquivalente Engines verwendet werden) gleich ist.

Verwandte Themen