Știu că doar folosind rand ()
este predictibilă, dacă știți ce faceți și aveți acces la server.
Am un proiect care este foarte dependent de alegerea unui număr aleator care este la fel de imprevizibil cu putință. Așadar, caut sugestii, fie alte funcții încorporate, fie funcții de utilizator, care pot genera un număr aleatoriu mai bun .
Am folosit acest lucru pentru a face un test mic:
$i = 0;
while($i < 10000){
$rand = rand(0, 100);
if(!isset($array[$rand])){
$array[$rand] = 1;
} else {
$array[$rand]++;
}
sort($array);
$i++;
}
Am constatat că rezultatele sunt distribuite uniform și există un model ciudat la numărul de ocazii generate de fiecare număr.
Variație la @ KG, folosind milisecunde de la EPOCH ca semințe pentru rand?
Adăugarea, înmulțirea sau trunchierea unei surse aleatoare necorespunzătoare vă va oferi un rezultat slab și aleatoriu. Consultați Introducere în numere aleatorii și aleatoare pentru o explicație.
Ai dreptate în ceea ce privește funcția PHP rand (). Consultați a doua cifră din Analiza statistică pentru o ilustrare izbitoare. (Prima figură este izbitoare, dar a fost desenată de Scott Adams, care nu a fost reprezentată cu rand ()).
O soluție este să utilizați un generator de aleatoare adevărat, cum ar fi random.org . Altă, dacă sunteți pe Linux / BSD / etc. este să utilizați / dev / random . În cazul în care întâmplarea este critică pentru misiune, va trebui să utilizați un generator aleatoriu hardware .
random.org has an API you can access via HTTP.
RANDOM.ORG este un serviciu de numere aleatoare care generează întâmplări prin zgomot atmosferic.
M-aș îngriji de impresia de aleatorie: au existat multe experimente în care oamenii ar alege distribuția mai puțin aleatorie. Se pare că mintea nu este foarte bună la producerea sau estimarea aleatorie.
Există articole bune despre întâmplare la Fourmilab , inclusiv un alt generator adevărat aleator . Poate că ați putea obține date aleatorii de pe ambele site-uri, deci dacă cineva este în jos, încă mai aveți alta.
Fourmilab oferă, de asemenea, un program de testare pentru a verifica întâmplarea. Ai putea să-l folosești pentru a-ți verifica diferitele programe myRand ().
În ceea ce privește ultimul program, dacă generați 10000 de valori, de ce nu alegeți valoarea finală dintre cele 10 mii? Vă restricționați la un subset. De asemenea, nu va funcționa dacă $ min și $ max sunt mai mari de 10000.
Oricum, aleatorie de care ai nevoie depinde de cererea ta. rand () va fi OK pentru un joc on-line, dar nu este bine pentru criptografie (orice nu este testat temeinic cu programele statistice nu va fi potrivit pentru criptografie oricum). Tu ești judecătorul!
O altă modalitate de obținere a numerelor aleatorii, asemănătoare conceptului cu obținerea UUID
PHP Versiunea 5.3 și versiunile anterioare
openssl_random_pseudo_bytes(...)
Sau puteți încerca următoarea bibliotecă utilizând RFC4122
A new PHP7 there is a function that does exactly what you needed: it generates cryptographically secure pseudo-random integers.
int random_int ( int $min , int $max )
generează cifre criptografice aleatorii potrivite pentru utilizare unde rezultatele imparțiale sunt critice (adică amestecarea unui pachet de poker).
Pentru o explicație mai detaliată despre PRNG și CSPRNG (și diferența lor), precum și de ce abordarea inițială este de fapt o idee proastă, vă rugăm să citiți un alt răspuns foarte similar .