2013-06-04 15 views
17

In questo codice:Cosa succede quando si copia un motore di numeri casuali e una distribuzione di numeri casuali?

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 

Puoi spiegare cosa succede esattamente in ciascuno dei casi da 1 a 6? Non vedo l'assegnazione della copia, la costruzione della copia e la costruzione delle mosse per queste classi documentate ovunque.

In particolare: Quando creiamo un nuovo motore/distribuzione da un altro, vuol resettare o continuare da dove si era interrotto?

risposta

12

Quando si copia un motore o una distribuzione, è garantito che entrambi i motori (o le distribuzioni) genereranno la stessa sequenza di valori da quel punto in poi.

Per i motori, lo standard richiede che E (x) produca un motore che paragona x (26.5.1.4, tabella 117). I motori sono uguali se la sequenza infinita di chiamate future al motore produce gli stessi valori (26.5.1.4).

Per le distribuzioni, sono richieste (26.5.1.6p4) per soddisfare i requisiti di CopyConstructible (tabella 21). Ciò richiede che l'oggetto creato sia equivalente all'originale. Il requisito per le distribuzioni di confronto uguali (26.5.1.6, tabella 118) è che hanno gli stessi parametri e la sequenza futura di valori generata (se si utilizzano motori equivalenti) è la stessa.