2012-02-05 12 views
13

Ho bisogno di generare una sequenza controllata di numeri pseudo-casuali, dato un parametro intero iniziale. Per questo sto usando la classe standard di Java Random, seminata da un parametro intero. Mi piacerebbe essere sicuro di generare la stessa sequenza tra i vari sistemi (sistema operativo, ma anche versione Java/JDK), nel prossimo futuro (e altro ancora!).Riproducibilità di numeri pseudo casuali java su sistemi e versioni?

In sintesi: Vuol Java garantire la riproducibilità/portabilità del suo pseudo-generatore di numeri casuali attraverso implementazione e versioni?

Nota: ho chiesto the exact same question for Python. Da allora ho cambiato il linguaggio di implementazione in Java ma per altri motivi.

+1

va bene finché non si riutilizza lo stesso generatore da più thread. Ora non ottieni questo commento sbagliato: il generatore stesso è thread-safe, ma se stai generando numeri da vari thread usando lo stesso generatore, non sarai in grado di riprodurre coerentemente le chiamate dai vari thread nello stesso identico ordinare su vari sistemi (nemmeno su varie esecuzioni sullo stesso sistema). – TacticalCoder

+0

Non sarà il caso, ma grazie per il suggerimento. Beh, per essere precisi, è possibile riprodurre la stessa sequenza in più thread usando un meccanismo di blocco adeguato, ma sono d'accordo con te che sta chiedendo dei problemi. –

risposta

14

Sì.

Il javadoc spiega:

Un'istanza di questa classe viene utilizzato per generare un flusso di numeri pseudocasuali. La classe utilizza un seme a 48 bit, che viene modificato utilizzando una formula congruenziale lineare. (Vedere Donald Knuth, L'arte della programmazione del computer, Volume 2, Sezione 3.2.1.)

Se due istanze di Random vengono create con lo stesso seme, e la stessa sequenza di chiamate di metodo viene effettuata per ciascuna, esse genererà e restituirà sequenze identiche di numeri. Per garantire questa proprietà, sono specificati algoritmi specifici per la classe Random. Le implementazioni Java devono utilizzare tutti gli algoritmi mostrati qui per lo class Random, a fini di assoluta portabilità del codice Java. Tuttavia, le sottoclassi di class Random possono utilizzare altri algoritmi, purché rispettino i contratti generali per tutti i metodi.

Problemi correlati