2012-11-27 4 views
18

Ad esempio, se istanzio un std::mt19937 con lo stesso seme e i medesimi parametri in GCC e in MSVC, dovrei ottenere la stessa sequenza di numeri casuali? Se è così, presumo che questa proprietà possa valere per mersenne_twister_engine in generale poiché mt19937 è solo uno con parametri specifici. Questo non è vero per rand() in C. Sembra che lo standard documenti le trasformazioni applicate in termini di codice specifico, quindi sospetto che dovrebbe essere sempre lo stesso, ma il diavolo è nei dettagli ...Lo standard C++ 11 garantisce numeri casuali identici per gli stessi seed attraverso le implementazioni?

+0

Diverse implementazioni di 'rand' utilizzano costanti diverse in modo che non possano mai corrispondere. Wikipedia contiene un utile elenco: http://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use –

+0

@MarkRansom: Diverse implementazioni sono autorizzate a utilizzare algoritmi totalmente diversi per rand(), costanti a parte. –

+0

"Consentito l'uso", sicuro. In pratica sembrano tutti uguali. –

risposta

20

Per il nuovi motori di numeri casuali, sì, per lo stesso seme e i parametri si otterrà la stessa sequenza di valori su tutte le piattaforme. Per rand(), n. Inoltre, non disponi di tale garanzia con distribuzioni di numeri casuali, anche quando vengono alimentate con la stessa sequenza di valori di input.

+2

Anche le distribuzioni non sono garantite per produrre gli stessi valori, quindi la combinazione di un motore con una distribuzione non darà risultati identici su tutte le piattaforme. – bames53

+0

C standard, 7.22.2.2/2 "La funzione srand utilizza l'argomento come seme per una nuova sequenza di numeri pseudo-casuali da restituire dalle successive chiamate a rand. Se srand viene quindi chiamato con lo stesso valore di inizializzazione, la sequenza di numeri pseudo-casuali deve essere ripetuto Se rand viene chiamato prima che siano state fatte tutte le chiamate a srand, la stessa sequenza deve essere generata come quando srand viene chiamato per la prima volta con un valore di seme di 1. " Come non è una garanzia? – rici

+0

Inoltre, per C++, la mia comprensione è che l'operatore == su due generatori, adattatori o distribuzioni sarà vero se creeranno le stesse sequenze infinite, quindi è possibile ottenere una garanzia se ne esiste una. – rici