Voglio sapere se c'è un modo per "prevedere" numero successivo generato e come JVM determina quale numero per generare il prossimo?
Assolutamente. La classe Random
è implementata come un generatore di numeri congruenti lineari (LCNG).La formula generale per un generatore lineare congruenziale è:
new_state = (old_state * C1 + C2) modulo N
il preciso algoritmo utilizzato dal Random
è specificato nel javadocs. Se si conosce lo stato corrente del generatore, lo stato successivo è completamente prevedibile.
Il mio codice emetterà un numero vicino al reale casuale in qualsiasi JVM e OS?
Se si utilizza Random
, quindi No. Non per qualsiasi JVM su qualsiasi sistema operativo.
La sequenza prodotta da un LCNG non è sicuramente casuale e ha proprietà statistiche che sono significativamente diverse da una vera sequenza casuale. (La sequenza sarà fortemente auto-correlata e verrà mostrata se si tracciano i risultati delle chiamate successive a Random.nextInt()
.)
Si tratta di un problema? Beh, dipende da cosa ha bisogno la tua applicazione. Se hai bisogno di numeri "casuali" che sono difficili da prevedere (ad esempio per un algoritmo correlato alla sicurezza), allora chiaramente no. E se i numeri saranno usati per una simulazione Monte Carlo, allora l'auto-correlazione inata di un LCNG può distorcere la simulazione. Ma se stai solo creando un gioco di carte solitario ... forse non importa.
fonte
2016-02-17 11:56:16
In realtà è pseudocasuale. Ciò significa che non sono in realtà casuali. Usa sempre lo stesso seme ogni volta e i numeri saranno sempre gli stessi. Perché? Stai cercando di impressionare qualcuno come capace di predire il futuro? : P – Arc676
Perché non leggi la documentazione? https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#next-int- – the8472
Potresti trovare interessante ciò che puoi fare con una scelta casuale. http://vanillajava.blogspot.co.uk/2011/10/randomly-no-so-random.html –