Randare mai bună Generarea de PHP

Ș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.

0
fr hi bn
Există o nouă funcție în php7, care face exact ceea ce aveți nevoie .
adăugat autor Salvador Dali, sursa

6 răspunsuri

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.

0
adăugat

Variație la @ KG, folosind milisecunde de la EPOCH ca semințe pentru rand?

0
adăugat
Sooooo, cu computerele rapide multi-core de astăzi, aveți o șansă destul de solidă de a re-folosi semințele de mai multe ori? Steagul roșu Humongous - reinventați o roată pătrată, chiar și srand() fără argumente face o treabă mai bună ("mai aleatoare").
adăugat autor Piskvor, sursa

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 .

0
adăugat

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 .

0
adăugat

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!

0
adăugat

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

0
adăugat
PHP România, Moldova
PHP România, Moldova
173 participanți

Vorbim despre Yii, Laravel, Symphony, MySQL, PgSQL, WP, OpenCart... Pentru confort, opriți notificările. Parteneri: https://ciupacabra.com @js_ro @node_ro @python_ro @seo_ro @Romania_Bot Offtop: @holywars_ro Joburi: @php_job @Grupuri_IT