Vera generazione casuale in Java

Stavo leggendo il Math.random () javadoc e ho visto che random è solo psuedorandom.

Esiste una libreria (specificatamente java) che genera numeri casuali in base a variabili casuali come temperatura ambientale, temperatura / voltaggio della CPU o qualcosa del genere?

Dai un’occhiata a http://random.org/

RANDOM.ORG è un vero servizio di numeri casuali che genera casualità tramite il rumore atmosferico.

La libreria Java per l’interfaccia con esso può essere trovata qui: http://sourceforge.net/projects/trng-random-org/

La tua domanda è ambigua, il che fa sì che le risposte siano dappertutto.

Se stai cercando un’implementazione Random che si basi sulla fonte di casualità del sistema (come suppongo tu sia), allora javax.crypto.SecureRandom lo fa. La configurazione predefinita per il provider di sicurezza Sun nel file java.security ha il seguente:

# # Select the source of seed data for SecureRandom. By default an # attempt is made to use the entropy gathering device specified by # the securerandom.source property. If an exception occurs when # accessing the URL then the traditional system/thread activity # algorithm is used. # # On Solaris and Linux systems, if file:/dev/urandom is specified and it # exists, a special SecureRandom implementation is activated by default. # This "NativePRNG" reads random bytes directly from /dev/urandom. # # On Windows systems, the URLs file:/dev/random and file:/dev/urandom # enables use of the Microsoft CryptoAPI seed functionality. # securerandom.source=file:/dev/urandom 

Se stai davvero chiedendo di sovrascrivere questo con qualcosa di ancora più veramente casuale, può essere fatto cambiando questa proprietà o usando un altro SecureRandom. Ad esempio, è ansible utilizzare un provider JCE supportato da un modulo HSM come nCipher nShield con il proprio PRNG o altre soluzioni menzionate nella discussione.

Dal momento che attingere a quelle fonti di dati casuali richiederebbe l’accesso all’hardware di qualche tipo tale libreria non può essere scritta in modo portabile usando puro Java.

Puoi comunque provare a scrivere codice dipendente dalla piattaforma per leggere l’origine delle piattaforms di dati casuali. Per Linux (e probabilmente anche altri sistemi simili a Unix) che potrebbe essere /dev/random per esempio.

Inoltre, guarda la class SecureRandom , potrebbe già avere quello che vuoi.

Veloce e sporco:

 public static int generateRandom() throws IOException { int num = 0; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); for (int i = 0 ; i < Integer.SIZE ; i++) { System.out .println("Flip a fair coin. Enter h for heads, anything else for tails."); if (br.readLine().charAt(0) == 'h') { num += Math.pow(2, i); } } return num; } 

Assicurati di voler veramente “veri” numeri casuali. Devono essere misurate le fonti fisiche di casualità e il processo di misurazione introduce qualche pregiudizio. Per alcune applicazioni, i numeri casuali “pseudo” sono in realtà preferibili ai numeri casuali “veri”. Possono avere proprietà statistiche migliori e puoi generarli più velocemente. D’altra parte, se non stai attento, puoi spararti ai piedi con generatori di numeri pseudocasuali.

La J ava Cryptographic Architecture richiede numeri casuali fortemente crittografati. Contiene la class SecureRandom menzionata da @saua.

Non esiste un vero generatore di numeri casuali poiché tutti si basano in un modo o nell’altro su procedure deterministiche per calcolare un numero casuale, quindi, non importa quanto i numeri generati sembrino seguire una distribuzione casuale vera, potrebbero essere una parte di una parte nascosta e molto modello complesso, quindi sono Pseudo-Casuali . Tuttavia, è ansible implementare il proprio generatore di numeri casuali, ci sono un paio di buoni metodi computazionali economici che è ansible leggere in Ricette numeriche in C, Seconda edizione – Sezione 7 . HTH

Giusto per chiarire: l’unico vero generatore casuale esistente nell’universo è il Quantum Random Bit Generator . Non c’è nessun altro meccanismo che ti assicuri, che i bit generati sono totalmente casuali, perché anche se ora non puoi predire il risultato non c’è garanzia che non sarai in grado di farlo in futuro.

Quantum Random Bit Generator ‘(QRBG121), che è un generatore di bit (numero) casuale non deterministico veloce la cui casualità si basa sulla casualità intrinseca del processo fisico quantistico dell’emissione fotonica nei semiconduttori e il successivo rilevamento mediante effetto fotoelettrico. In questo processo i fotoni vengono rilevati casualmente, uno per uno indipendentemente l’uno dall’altro. Le informazioni di timing dei fotoni rilevati vengono utilizzate per generare cifre binarie casuali – bit. La caratteristica unica di questo metodo è che utilizza un solo rilevatore di fotoni per produrre sia zeri che uno che si traduce in una polarizzazione molto piccola e un’alta immunità alla variazione e all’invecchiamento dei componenti. Inoltre, il rilevamento di singoli fotoni è fatto da un fotomoltiplicatore (PMT). Rispetto ai rilevatori di fotoni allo stato solido, le PMT hanno prestazioni drasticamente superiori rispetto al rumore e una probabilità molto più bassa di comparsa di afterpuls che potrebbe essere una fonte di correlazioni indesiderate.

Maggiori informazioni per esempio qui: http://random.irb.hr/

Citazione di Wikipedia: John von Neumann ha detto “Chiunque usi i metodi aritmetici per produrre numeri casuali è in uno stato di peccato”.

Per la maggior parte degli scopi, i numeri pseudo-casuali sono più che sufficienti. Se hai solo bisogno di un semplice numero casuale, es. nel 30% delle volte fai questo, quindi un timestamp come seme è ciò che vuoi. Se questo deve essere un numero casuale sicuro, per esempio mescolare un mazzo, vuoi scegliere il seme un po ‘più attentamente, ci sono buone fonti là fuori per creare semi sicuri.

La ragione per usare i semi è quella di essere in grado di “richiamare” la stessa sequenza di numeri casuali generati dall’algoritmo. Un ottimo scenario è quando si sta facendo una simulazione stocastica su qualche tipo e si desidera ripetere un particolare esperimento, quindi si usa semplicemente lo stesso seme.

Per un PRNG migliore rispetto a quello in bundle con Java, dai un’occhiata al Mersenne Twister .

All’università avevo il compito di implementare un generatore casuale. Ho creato un generatore di numeri casuali come questo: creato la finestra del desktop e chiesto a un utente di fare clic su posizioni casuali sulla finestra, dopo ogni clic ho preso le coordinate del punto cliccato. È stato piuttosto casuale, penso.

Vedi anche questa domanda SO: Fonti di entropia alternative

Ho trovato HotBits diversi anni fa – i numeri sono generati dal decadimento radioattivo, numeri veramente casuali.

C’è una libreria java per l’accesso a randomx

Ci sono dei limiti su quanti numeri puoi scaricare al giorno, ma mi ha sempre divertito ad usarli come semi veramente casuali per RNG.

Per quanto ne so lavorano con il tempo della macchina …!

Per quali numeri casuali vengono utilizzati

I numeri casuali sono stati usati per molte migliaia di anni. Che si tratti di lanciare una moneta o lanciare un dado, l’objective è di lasciare il risultato finale al caso. I generatori di numeri casuali in un computer sono simili – sono un tentativo di ottenere un risultato casuale imprevedibile.

È ansible creare numeri casuali veri?

Sì !

Per generare un numero casuale “vero”, il computer misura un tipo di fenomeno fisico che avviene al di fuori del computer.

Per un esempio più quotidiano, il computer potrebbe fare affidamento sul rumore atmosferico o semplicemente utilizzare l’ora esatta in cui si premono i tasti della tastiera come fonte di dati imprevedibili o entropia. Ad esempio, il tuo computer potrebbe notare che hai premuto un tasto esattamente a 0.23423523 secondi dopo le 14.00. Prendi abbastanza dei tempi specifici associati a questi tasti e avrai una fonte di entropia che puoi usare per generare un numero casuale “vero”.

L’NSA e il generatore di numeri casuali dell’hardware di Intel

Per rendere le cose più facili agli sviluppatori e aiutare a generare numeri casuali sicuri, i chip Intel includono un generatore di numeri casuali basato su hardware noto come RdRand. Questo chip utilizza una fonte di entropia sul processore e fornisce numeri casuali al software quando il software li richiede.

fonte: HowToGeek?

Nel caso in cui tu abbia bisogno di generare numeri casuali su Android … Io uso Data of Accelerometer per veri numeri casuali basati sul fisico 🙂