2013-01-20 19 views
21

In Java abbiamo la matematica della classe statica. Non è necessario creare i suoi oggetti in modo che sia statico. Un altro è la classe Random. Non abbiamo bisogno di creare le sue istanze, quindi perché non è anche statico? Le mie classi uso spesso numeri casuali e mi arrabbio quando devo creare field rand in ogni classe per generare numeri casuali. Allora perché non è statico?Perché la classe Random non è statica?

+9

Le classi di livello superiore in Java non possono essere dichiarate come statiche e * è * necessario creare istanze di 'Casuale'. Entrambe le premesse della tua domanda non sono corrette, in pratica. –

+0

Classe =/= metodo. –

+0

C'è un random statico() in Math. – josefx

risposta

24

La classe Random ha lo stato, incluso dove si trova nella sua sequenza, poiché i valori prodotti non sono veramente casuali, solo una sequenza pseudo-casuale.

Ciò può essere dimostrato inizializzando due istanze con lo stesso seme.

Random a = new Random(123); 
Random b = new Random(123); 
for (int i = 0; i < 5; i++) { 
    System.out.println(a.nextInt() + "," + b.nextInt()); 
} 

uscita

-1188957731,-1188957731 
1018954901,1018954901 
-39088943,-39088943 
1295249578,1295249578 
1087885590,1087885590 

Se si crea con il costruttore di default Random(), poi il seme viene inizializzato in base al tempo corrente in nanosecondi + un contatore statico, il che significa che diverse istanze sono molto probabile avere sequenze diverse.

+1

* Se crei con il costruttore predefinito Random(), il seme viene inizializzato con il tempo corrente in millisecondi * - questo non è corretto, il seeding anche per il predefinito 'new Random()' è più sofisticato di un semplice 'Sistema .currentTimeMillis() ' – bestsss

+0

@bestsss Ci scusiamo, sei corretto. Stavo guardando una fonte molto vecchia per java.util.Random (una delle prime partite su google fastidiosamente). Usando System.currentTimeMillis() era il comportamento pre 1.5, ma ora come dici tu, molto più sofisticato. – Adam

+0

Sì, è stato modificato in 1.5, era effettivamente solo millisec (abbastanza zoppo) – bestsss

13

È do necessario creare istanze, perché un generatore di numeri casuali ha stato. Nello specifico, lo stato che controlla la posizione corrente nella sequenza pseudo-casuale.

Se si desidera più generatori indipendenti (che non condividono lo stato), occorrono istanze separate.

4

Il motivo è che potrebbero essere necessari più generatori di numeri casuali indipendenti. Ciò si ottiene avendo più istanze di Random.

5

Si tratta di semi. Come sai, non parliamo di numeri casuali reali ma di pseudo-casuali. Quando conosci il primo numero, puoi calcolare gli altri. Questo è il motivo per cui usiamo qualcosa come "un seme". Ogni oggetto di Random ha seme diverso. Se Random fosse statico, non potresti avere due semi diversi. Si noti che il metodo setSeed() interesserebbe quindi tutti i generatori di numeri casuali (e spesso si desidera modificare solo uno).

Problemi correlati