Lo scopo di questo post non è parlare dei vari rand o mt_rand bensì quello di capire un po' di più l’universo che ruota attorno ai numeri random.
Sappiamo che un computer può essere in grado di generare solo PRNG (pseudo random number generator) - come ad esempio il metodo Monte Carlo.
Per generare i TRNG (true random number generator) ci vuole un generatore hardware di numeri casuali che generalmente sono basati su fenomeni microscopici come il rumore termico, l'effetto fotoelettrico o il decadimento dell'uranio o del cesio radioattivo.
Un generatore di numeri pseudo-casuali deve essere inizializzato assegnando un opportuno valore a un parametro numerico (il cosiddetto seme).
Con php si utilizzava la funzione srand o mt_srand per inizializzare il parametro; mentre invece dalla versione 4.2.0 questo procedimento avviene automaticamente.
I numeri pseudo-casuali, presi in un numero sufficientemente ampio:
- soddisfano il requisito dell'equidistribuzione (cioè se ad esempio si simula 50.000 volte il lancio di un dado otterremo circa 8333 per ogni faccia)
- presentano indipendenza fra elementi successivi della sequenza (ad esempio la faccia 3 non sarà sempre seguita dalla faccia 5, oppure sono tutte sequenze del tipo 1-2-3-4-5-6…).
Se l'input di partenza è il medesimo (il seme) la sequenza generata è la stessa.
Hanno però il vantaggio di avere un elevato throughput di numeri generati.
I TRNG hanno il vantaggio della genuinità del numero casuale, il quale risulta statisticamente indipendente da qualsiasi altro numero generato nello stesso contesto; presentano, di conseguenza, un basso throughput.
Se da un lato generare una sequenza PRNG è semplice e sarà equidistribuita ed indipendenza fra due elementi consecutivi, potrà comunque risultare in qualche modo "prevedibile"; dall'altro lato procurarsi un generatore hardware di numeri casuali (TRNG) dovrebbe essere cosa molto complessa (?).
Una giusta via di mezzo, che dovrebbe combinare i vantaggi dei due metodi (pur facendo conservare un elevato throughput) potrebbe essere quello di sfruttare i PRNG con algoritmi difficilmente predicibili.
Ora alcune domande e considerazioni...
- quale algoritmo utilizza php?
- da quello che ho capito php inizializza automaticamente il seme.
Una volta inizializzato però la sequenza dei numeri casuali generati sarà sempre quella - dato il seme -. Giusto?
- utilizzando srand si andava ad inizializzare il seme. Poniamo il caso che con srand si andasse ad inizializzare il seme al valore di 358948 (dico un numero a caso).
Se adesso il seme venisse inizializzato proprio a 358948 si otterrebbe la stessa sequenza di numeri casuali giusto?
- Avete idea di qualche algoritmo "difficilmente predicibile" da utilizzare con php?
Grazie.