Domanda

Lo so, sto solo usando rand() è prevedibile, se sai cosa stai facendo e hai accesso al server.

Ho un progetto che lo è altamente dipende dalla scelta di un numero casuale il più imprevedibile possibile.Quindi sto cercando suggerimenti, altre funzioni integrate o funzioni utente, che possano generare un file Meglio numero casuale.

Ho usato questo per fare un piccolo test:

$i = 0;

while($i < 10000){
    $rand = rand(0, 100);

    if(!isset($array[$rand])){
        $array[$rand] = 1;
    } else {
        $array[$rand]++;
    }

    sort($array);
    $i++;
}

Ho riscontrato che i risultati sono distribuiti uniformemente e che esiste uno schema dispari nel numero di volte in cui ciascun numero viene generato.

È stato utile?

Soluzione

Aggiungendo, moltiplicando o troncando una fonte casuale scadente si otterrà un risultato casuale scadente.Vedere Introduzione alla casualità e ai numeri casuali per una spiegazione.

Hai ragione sulla funzione PHP rand().Vedi la seconda figura Analisi statistica per un'illustrazione sorprendente.(La prima figura è sorprendente, ma è stata disegnata da Scott Adams, non tracciata con rand()).

Una soluzione è utilizzare un vero generatore casuale come random.org.Un altro, se sei su Linux/BSD/ecc.è usare /dev/casuale.Se la casualità è fondamentale, dovrai utilizzare a generatore casuale hardware.

Altri suggerimenti

random.org ha un'API a cui puoi accedere tramite HTTP.

Random.org è un vero servizio di numeri casuali che genera casualità tramite rumore atmosferico.

Farei attenzione all'impressione di casualità:ci sono stati molti esperimenti in cui le persone sceglievano la distribuzione meno casuale.Sembra che la mente non sia molto brava a produrre o stimare la casualità.

Ci sono buoni articoli sulla casualità su Quattromilalab, compreso un altro vero generatore casuale.Forse potresti ottenere dati casuali da entrambi i siti, quindi se uno è inattivo hai ancora l'altro.

Fourmilab fornisce anche a programma di prova per verificare la casualità.Potresti usarlo per controllare i tuoi vari programmi myRand().

Per quanto riguarda il tuo ultimo programma, se generi 10000 valori, perché non scegli il valore finale tra 10mila?Ti limiti a un sottoinsieme.Inoltre, non funzionerà se i tuoi $min e $max sono maggiori di 10000.

Ad ogni modo, la casualità di cui hai bisogno dipende dalla tua applicazione.rand() andrà bene per un gioco online, ma non va bene per la crittografia (qualsiasi cosa non testata a fondo con programmi statistici non sarà comunque adatta alla crittografia).Sii tu il giudice!

Variazione su @KG, utilizzando i millisecondi da EPOCH come seme per il rand?

Un altro modo per ottenere numeri casuali, concettualmente simile all'ottenimento dell'UUID

PHP versione 5.3 e successive

openssl_random_pseudo_bytes(...)

Oppure puoi provare quanto segue biblioteca utilizzando RFC4122

Un nuovo PHP7 c'è una funzione che fa esattamente quello di cui avevi bisogno:genera interi pseudo-casuali crittograficamente sicuri.

int random_int ( int $min , int $max )

Genera numeri interi casuali crittografici adatti all'uso in cui i risultati imparziali sono fondamentali (cioèmescolando un mazzo di poker).

Per una spiegazione più dettagliata su PRNG e CSPRNG (e la loro differenza) e sul motivo per cui il tuo approccio originale è in realtà una cattiva idea, leggi il mio un'altra risposta molto simile.

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