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?
risposta
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.
* 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
@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
Sì, è stato modificato in 1.5, era effettivamente solo millisec (abbastanza zoppo) – bestsss
È 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.
Il motivo è che potrebbero essere necessari più generatori di numeri casuali indipendenti. Ciò si ottiene avendo più istanze di Random
.
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).
- 1. Perché la classe System.Random non è statica?
- 2. Perché classe Python non riconoscere variabile statica
- 3. Perché il JDK ha sia Math.random() sia la classe Random?
- 4. Qual è la qualità dell'implementazione della classe Random in .NET?
- 5. C# classe statica perché usare?
- 6. Perché la mia classe non è accettabile
- 7. Perché la classe dichiarata come statica in Java?
- 8. Perché una classe Java non può essere dichiarata come statica?
- 9. random.choice non random
- 10. modifica delle variabili finali tramite la riflessione, perché differenza tra variabile finale statica e non statica
- 11. Come può una classe non statica chiamare un altro metodo di una classe non statica?
- 12. Prestazioni di classe statica Android e classe di memoria non statica
- 13. Impossibile importare la classe interna statica?
- 14. Come faccio a rendere la mia classe statica non così statica?
- 15. Usa la classe statica per interfaccia?
- 16. Riferimento metodo costruttore per la classe interna (non statica)?
- 17. È sicuro bloccare una variabile statica in una classe non statica?
- 18. Perché una classe non può estendere una classe nidificata statica che si verifica al suo interno?
- 19. campi statici private in classe non statica
- 20. Perché la mia libreria statica è così grande?
- 21. Perché una classe interna serializzabile non è serializzabile?
- 22. Qual è il modo corretto di implementare AsyncTask? classe nidificata statica o non statica?
- 23. Perché random non funziona nella GUI in REBOL?
- 24. Metodo statico di una classe statica rispetto al metodo statico di una classe non statica (C#)
- 25. Impossibile eseguire il downcast perché la classe non è polimorfica?
- 26. Perché Java non è riuscito a trovare la classe principale?
- 27. allocazione di classe statica
- 28. classe statica e singleton
- 29. la dichiarazione statica segue la dichiarazione non statica
- 30. Perché non dovrei inizializzare la variabile statica nell'intestazione?
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. –
Classe =/= metodo. –
C'è un random statico() in Math. – josefx