2016-02-17 21 views
5

ho scritto programma che simula lancio dei dadiCome funziona il generatore casuale Java?

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

voglio sapere se c'è un modo per "prevedere" numero successivo generato e come JVM determina quale numero per generare il prossimo?

Il mio codice emetterà un numero vicino al reale casuale in qualsiasi JVM e OS?

+1

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

+0

Perché non leggi la documentazione? https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#next-int- – the8472

+1

Potresti trovare interessante ciò che puoi fare con una scelta casuale. http://vanillajava.blogspot.co.uk/2011/10/randomly-no-so-random.html –

risposta

12

Sono numeri pseudocasuali, 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 è possibile scegliere il seme, è possibile precalculate i numeri, poi resettare il generatore con lo stesso seme e saprete in anticipo quali numeri escono.

1

Sì, è possibile prevedere quale numero verrà generato da un generatore di numeri casuali. Ho visto questo chiamato cracking, rottura o attacco al RNG. La ricerca di uno qualsiasi di questi termini insieme a "generatore di numeri casuali" dovrebbe generare molti risultati.

Leggi How We Learned to Cheat at Online Poker: A Study in Software Security per un eccellente resoconto di prima mano di come un generatore di numeri casuali può essere attaccato. Per riassumere, gli autori hanno capito quale RNG veniva utilizzato basandosi su un algoritmo di mischia scorretto utilizzato da un sito di poker online. Hanno quindi capito il seme RNG campionando le mani che sono state distribuite. Una volta avuto l'algoritmo e il seme, sapevano esattamente come sarebbe stato organizzato il mazzo dopo le mescolanze successive.

È anche possibile consultare questo link.

1

Controllare How does java.util.Random work and how good is it:?

In altre parole, cominciamo con un po 'di inizio o il numero "seme", che è idealmente "veramente imprevedibile", e che in pratica è "abbastanza imprevedibile". Ad esempio, il numero di millisecondi - o anche in nanosecondi - dal momento dell'accensione del computer è disponibile nella maggior parte dei sistemi su . Quindi, ogni volta che vogliamo un numero casuale, moltiplichiamo il seme corrente di con un numero fisso, a, aggiungi un altro numero fisso, c, quindi prendi il modulo modulo un altro numero fisso, m. Il numero a è generalmente grande. Questo metodo di generazione di numeri casuali risale a praticamente all'alba del calcolo1. Praticamente tutti i generatori di numeri casuali "casuali" che si possono pensare - da quelli dei calcolatori scientifici agli home computer degli anni '80 alle funzioni di libreria C di oggi e Visual Basic - utilizza alcune varianti della formula precedente per generare i numeri casuali di .

E anche Predicting the next Math.random() in Java

8

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.

+0

Cosa intendi per stato attuale? E lo stato precedente è stato salvato? Se sì, come? – Lealo

+0

1) I valori delle variabili di istanza (private) del generatore. Guarda il codice sorgente. 2) AFAIK, n. –