Come funziona Java random generator?


Ho scritto un programma che simula il lancio dei dadi

    Random r = new Random();
    int result = r.nextInt(6);
    System.out.println(result);

Voglio sapere se c'è un modo per "prevedere" il prossimo numero generato e in che modo JVM determina quale numero generare dopo?

Il mio codice emetterà numeri vicini al reale casuale in qualsiasi JVM e sistema operativo?

Author: David Mumladze, 2016-02-17

4 answers

Sono numeri pseudorandom, il che significa che per scopi generali, sono abbastanza casuali. Tuttavia sono deterministici e interamente dipendenti dal seme. Il seguente codice stamperà gli stessi 10 numeri due volte.

Random rnd = new Random(1234);
for(int i = 0;i < 10; i++)
    System.out.println(rnd.nextInt(100));

rnd = new Random(1234);
for(int i = 0;i < 10; i++)
    System.out.println(rnd.nextInt(100));

Se puoi scegliere il seme, puoi prima precalcolare i numeri, quindi resettare il generatore con lo stesso seme e saprai in anticipo quali numeri escono.

 14
Author: Kayaman, 2016-02-17 12:12:25

Voglio sapere se c'è un modo per "prevedere" il prossimo numero generato e in che modo JVM determina quale numero generare dopo?

Assolutamente. La classe Random è implementata come linear Congruential Number generator (LCNG). La formula generale per un generatore congruenziale lineare è:

new_state = (old_state * C1 + C2) modulo N

L'algoritmo preciso utilizzato da Randomè specificato in javadocs. Se si conosce lo stato corrente del generatore, lo stato successivo è completamente prevedibile.

Il mio codice emetterà numeri vicini al reale casuale in qualsiasi JVM e sistema operativo?

Se usi Random, allora No. Non per qualsiasi JVM su qualsiasi sistema operativo.

La sequenza prodotta da un LCNG non è sicuramente casuale e ha proprietà statistiche significativamente diverse da una vera sequenza casuale. (La sequenza sarà fortemente auto-correlata e questo verrà visualizzato se si tracciano i risultati delle chiamate successive a Random.nextInt().)

È un problema? Bene dipende da ciò di cui ha bisogno la tua applicazione. Se hai bisogno di numeri "casuali" difficili da prevedere (ad esempio per un algoritmo correlato alla sicurezza), allora chiaramente no. E se i numeri verranno utilizzati per una simulazione Monte Carlo, l'auto-correlazione inate di un LCNG può distorcere la simulazione. Ma se si sta solo costruendo un gioco di carte solitario ... forse non ha importanza.

 9
Author: Stephen C, 2016-02-17 13:06:40

Sì, è possibile prevedere quale numero produrrà un generatore di numeri casuali. Ho visto questo chiamato cracking, rottura, o attaccare il RNG. La ricerca di uno di questi termini insieme a "generatore di numeri casuali" dovrebbe ottenere molti risultati.

Leggi Come abbiamo imparato a imbrogliare al poker online: Uno studio sulla sicurezza del software per un eccellente resoconto di prima mano di come un generatore di numeri casuali può essere attaccato. Per riassumere, gli autori hanno capito cosa fosse RNG essere utilizzato sulla base di un algoritmo di mischiare difettoso impiegato da un sito di poker online. Hanno poi capito il seme RNG campionando le mani che sono state distribuite. Una volta che avevano l'algoritmo e il seme, sapevano esattamente come sarebbe stato organizzato il mazzo dopo le mescole successive.

Puoi anche fare riferimento a questo link .

 1
Author: Mohith P, 2016-02-17 11:50:52

Controlla Come funziona java.util.Lavoro casuale e quanto è buono?:

In altre parole, iniziamo con un numero iniziale o" seme " che idealmente è "veramente imprevedibile", e che in pratica è "abbastanza imprevedibile". Ad esempio, il numero di millisecondi-o anche nanosecondi-dal momento che il computer è stato acceso è disponibile su la maggior parte dei sistemi. Quindi, ogni volta che vogliamo un numero casuale, moltiplichiamo il seme corrente da qualche numero fisso, a, aggiungere un altro fisso numero, c, quindi prendi il risultato modulo un altro numero fisso, m. Il numero a è generalmente grande. Questo metodo di generazione di numeri casuali risale praticamente agli albori del computing1. Praticamente ogni " casuale" generatore di numeri casuali si può pensare - da quelli di scientifica calcolatrici a 1980 computer di casa a currentday C e Visual Basic funzioni di libreria: utilizza alcune varianti della formula precedente per generare i suoi numeri casuali.

E anche Predire il prossima matematica.random () in Java

 1
Author: Rahul Tripathi, 2016-02-17 11:53:32