Domanda

Dopo aver letto questa risposta: il modo migliore per scegliere un sottoinsieme casuale da una raccolta ?

Mi sono meravigliato, come si fa a scegliere un seme casuale in Java?

E non dire usare System.currentTimeMillis () o System.nanoTime (). Leggi l'articolo per vedere perché no.

Questa è una domanda difficile, ma permettimi di renderlo più difficile. Diciamo che è necessario generare un seed casuale senza connettersi a Internet, senza utilizzare l'input dell'utente (IE, non c'è gui) e deve essere multipiattaforma (quindi non c'è JNI per accedere all'hardware).

Esistono alcune variabili JVM che possiamo monitorare come fonte della nostra casualità?

Questo può essere fatto? O è impossibile?

È stato utile?

Soluzione

Dai un'occhiata a Uncommons Maths (divulgazione completa: l'ho scritto). Dovrebbe risolvere la maggior parte dei problemi che avrai mai con numeri casuali in Java.

Anche se non lo usi dovresti essere in grado di ottenere alcune idee dai vari SeedGenerator implementazioni che fornisce. Fondamentalmente, per impostazione predefinita utilizza / dev / random . Se ciò non esiste (ad es. Windows) tenta di scaricare i dati da random.org oppure utilizza SecureRandom.generateSeed .

Penso che SecureRandom.generateSeed sia il meglio che puoi fare senza fare affidamento su qualcosa di specifico della piattaforma o su Internet.

Altri suggerimenti

Combina System.currentTimeMillis () con un contatore globale che aumenti ogni volta che generi il seed. Usa AtomicLong per il contatore in modo da poter incrementare con efficienza e sicurezza del thread.

" Unire " non significa " aggiungi " o "xor" perché è troppo facile ottenere duplicati. Invece, hash. Potresti complicarti e riempire il lungo e il contatore in es. 16 byte e MD5, ma probabilmente utilizzerei una versione a 64 bit di Adler CRC o qualche altro CRC a 64 bit .

Uhm, quell'articolo dice che i semi a 32 bit sono cattivi, ma i semi a 64 bit sono buoni. System.currentTimeMillis () è un seme a 64 bit.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top