Domanda Qual è lo svantaggio di mt_rand?


Qual è la definizione di bias in:

La distribuzione di mt_rand () i valori di ritorno sono distorti verso numeri pari su build di PHP a 64 bit quando max è oltre 2 ^ 32.

Se è il tipo di pregiudizio dichiarato in regole alternative per l'arrotondamento per l'arrotondamento, Non penso che importi davvero (dal momento che il pregiudizio non è realmente visibile).

inoltre mt_rand() è ha sostenuto essere quattro volte più veloce di rand(), aggiungendo tre caratteri davanti!

assumendo mt_rand è disponibile, qual è lo svantaggio di usarlo?


26
2017-10-18 13:31


origine


risposte:


mt_rand usa il Mersenne Twister algoritmo, che è molto meglio del LCG tipicamente usato da rand. Ad esempio, il periodo di un LCG è un misero 232, mentre il periodo di mt_rand è 219937 - 1. Inoltre, tutti i valori generati da un LCG lo faranno giacciono su linee o piani quando sono tracciati in uno spazio multidimensionale. Inoltre, non solo è praticamente fattibile, ma è relativamente facile determinare i parametri di un LCG. L'unico vantaggio che gli LCG hanno è potenzialmente leggermente più veloce, ma su una scala che è completamente irrilevante durante la codifica in PHP.

Però, mt_rand è non adatto per scopi crittografici (generazione di token, password o chiavi crittografiche).

Se hai bisogno di casualità crittografica, usa random_int in php 7. Su versioni php precedenti, leggi da /dev/urandom o /dev/random su un sistema operativo conforme a POSIX.


57
2017-10-18 13:48



La stranezza della distribuzione che hai citato è rilevante solo quando l'intervallo di numeri casuali che stai generando è maggiore di 2 ^ 32. Quello è 4294967296.

Se stai lavorando con numeri così grandi e hai bisogno che siano randomizzati, forse questo è un motivo per riconsiderare l'utilizzo mt_rand(). Tuttavia se lavori con numeri più piccoli di questo, allora è irrilevante.

La ragione per cui accade è dovuta alla precisione del generatore di numeri casuali che non è abbastanza buono in quelle alte gamme.

Non ho mai lavorato con numeri casuali così grandi, quindi non ho mai avuto bisogno di preoccuparmene.

La differenza tra rand() e mt_rand() è molto più di "solo tre personaggi in più". Sono chiamate di funzione completamente diverse e funzionano in modi completamente diversi. Proprio come non ti aspetti print() e print_r() essere simile

mt_rand() prende il nome dall'algoritmo "Mersene Twister" che usa per generare i numeri casuali. Questo algoritmo è noto per essere un generatore di numeri casuali rapido, efficiente e di alta qualità, motivo per cui è disponibile in PHP.

Il più vecchio rand() la funzione fa uso del generatore di numeri casuali del sistema operativo effettuando una chiamata di sistema. Ciò significa che utilizza qualsiasi generatore di numeri casuali che sia il predefinito sul sistema operativo che stai utilizzando. In generale, il generatore di numeri casuali predefinito utilizza un algoritmo molto più lento e vecchio, da cui l'affermazione my_rand()è più veloce, ma varierà da sistema a sistema.

Pertanto, per praticamente tutti gli usi, mt_rand() è una funzione migliore da usare di rand().

Dici "supponendo mt_rand() è disponibile ", ma lo sarà sempre da quando è stato introdotto in PHP4.


8
2017-10-18 13:51