Număr aleatoriu în php. Folosind funcția aleatoare PHP

Pentru a genera un număr aleator, puteți utiliza funcția PHP rand() sau mt_rand(). Cerința de a folosi numere aleatoare apare adesea în practică pentru denumirea variabilelor, fișierele, crearea informațiilor cheie și asigurarea securității.

Aleatorie și unicitate

Funcția aleatorie PHP vine în două variante: rand() și mt_rand(). Se crede că algoritmul în primul caz este mai simplu și generează numere pseudoaleatoare. A doua opțiune are un algoritm mai rapid și caracteristici matematice binecunoscute. În cele mai multe cazuri, când trebuie să obțineți un număr aleator, puteți utiliza o serie de apeluri aleatoare PHP și puteți obține o combinație unică de numere.

Dacă luați ca bază numere de la 1 la 26 sau de la 1 la 32 și le obțineți aleatoriu, puteți forma informații cheie ca o succesiune de litere latine sau chirilice. În acest caz, PHP random este o modalitate de a genera o secvență de informații alfabetice, de exemplu în scopul testării canalelor de comunicare sau a algoritmilor.

Un număr aleator este rareori unic, deoarece poate apărea de mai multe ori conform legii de distribuție a unei variabile aleatoare. Dar dacă combinați, în special, variabila statică PHP & Math.random a limbajului JavaScript, puteți obține un număr real unic aleatoriu care nu se va repeta în timp.

Utilizarea funcției de timp

Funcția de timp, atât PHP, cât și JavaScript, vă permite să formați combinații unice de numere, rareori când un număr suficient de mare de evenimente poate apărea la un moment dat și variabila aleatoare se va repeta.

Prin aplicarea aleatorie PHP în intervalul de secunde sau milisecunde pe o gamă largă de valori posibile, este posibil să se obțină combinații aleatorii unice de numere sau litere. Ce altceva?

Combinând valoarea funcției de timp, un număr în creștere secvențial și aleatoriu PHP, puteți asigura securitatea de încredere a canalelor de comunicare client și server, puteți crea coduri unice pentru variabile și puteți genera evenimente imprevizibile în algoritmi.

Un generator de numere aleatoare PHP este o soluție excelentă pentru majoritatea sarcinilor, mai ales atunci când trebuie să obțineți rapid rezultate de înaltă calitate cu efort minim. Utilizarea funcțiilor rand() și mt_rand împreună cu serii de numere sau valori de timp în creștere secvențială vă permite să obțineți numere aleatorii, atât repetate în valori, cât și unice.

Sarcină
Trebuie să generați un număr aleatoriu într-un interval numeric.

Soluţie
Funcția mt_rand() este concepută pentru asta:

// număr aleatoriu între $upper și $lower, inclusiv
$numar_aleatoriu = mt_rand($inferior, $sus);

Discuţie
Generarea de numere aleatorii este utilă atunci când trebuie să afișați o imagine aleatorie pe ecran, să alocați aleatoriu un punct de pornire într-un joc, să selectați o intrare aleatorie dintr-o bază de date sau să generați un identificator unic de sesiune. Pentru a genera un număr aleator în intervalul dintre două puncte, trebuie să transmiteți două argumente funcției mt_rand():

$numar_aleatoriu = mt_rand(1, 100);

Apelarea mt_rand() fără argumente returnează un număr între zero și numărul maxim aleatoriu returnat de mt_getrandmax(). Este dificil pentru un computer să genereze un număr cu adevărat aleatoriu. Este mult mai bun să urmeze metodic instrucțiunile și nu este atât de bun dacă i se cere să acționeze spontan. Dacă trebuie să forțați un computer să producă un număr aleatoriu, atunci trebuie să îi oferiți un anumit set de comenzi repetabile, iar faptul însuși al repetabilității face ca obținerea aleatoriei să fie mai puțin probabilă.

PHP are două generatoare de numere aleatoare diferite: funcția clasică numită rand() și funcția mai avansată mt_rand().

MT (Mersenne Twister) este un generator de numere pseudoaleatoare numit după călugărul și matematicianul francez Marin Mersenne, care a studiat numerele prime. Algoritmul acestui generator se bazează pe aceste numere prime. Funcția mt_rand() este mai rapidă decât funcția rand() și produce mai multe numere aleatoare, așa că le preferăm pe prima.

Dacă aveți o versiune de PHP anterioară 4.2, atunci înainte de a apela funcția mt_rand() (sau rand()) pentru prima dată, trebuie să inițializați generatorul cu o valoare inițială apelând mt_srand() (sau srand(). )) funcția. Sămânța este numărul pe care funcția aleatoare îl folosește ca bază pentru generarea numerelor aleatoare pe care le returnează; se referă la o modalitate de rezolvare a dilemei menționate mai sus – repetabilitate versus aleatorie.

Ca valoare inițială care se modifică foarte rapid și cu o probabilitate scăzută de repetabilitate (aceste proprietăți ar trebui să caracterizeze o valoare inițială bună), puteți lua valoarea returnată de funcția de timp de înaltă precizie microtime(). Este suficient să inițializați generatorul o dată. PHP 4.2 și versiunile ulterioare se ocupă automat de inițializare, dar dacă valoarea inițială este setată manual înainte de primul apel la mt_rand(), PHP nu o înlocuiește cu propria sa valoare inițială.

Dacă trebuie să selectați o înregistrare aleatorie dintr-o bază de date, cel mai simplu mod este să determinați mai întâi numărul total de câmpuri din tabel, să selectați un număr aleator din acel interval și apoi să interogați acel rând din baza de date:

$sth = $dbh->query("SELECT COUNT(*) AS count FROM ghilimele");
dacă ($rând = $sth->fetchRow()) (
$număr = $rând;
) altfel (
die ($row->getMessage());
}
$aleatoriu = mt_rand(0, $număr - 1);
$sth = $dbh->query("SELECTARE citat DIN ghilimele LIMIT $random,1");
în timp ce ($rând = $sth->fetchRow()) (
print $row .

„\n”;
}

Acest fragment de cod determină numărul total de rânduri din tabel, generează un număr aleator din acel interval și apoi folosește LIMIT $random,1 pentru a SELECTA un rând din tabel începând cu poziția $random. În versiunea MySQL 3.23 sau mai mare, este posibilă o opțiune alternativă:

$sth = $dbh->query("SELECTARE citat din ghilimele ORDER BY RAND() LIMIT 1");
în timp ce ($rând = $sth->fetchRow()) (
print $row . „\n”;
}

În acest caz, MySQL mai întâi randomizează rândurile și apoi returnează primul rând.

Inițializează generatorul de numere aleatoare. Sintaxă:

Void srand(int seed)

Inițializează generatorul de numere aleatoare cu valoarea inițială.

Srand((dublu) microtime()*1000000);
$aleatoriu = rand();
echo $aleatoriu;

GETRANDMAX

Returnează cel mai mare număr aleatoriu posibil. Sintaxă:

Int getrandmax()

Această funcție returnează valoarea maximă care poate fi obținută folosind funcția de generare a numerelor aleatoare rand().

De obicei este 32767

Generează un număr aleatoriu. Sintaxă:

Int rand()

Când este apelată cu parametrii opționali min și max, această funcție generează un număr aleatoriu până la și inclusiv acei parametri. Dacă lipsesc parametrii min și max, este returnat un număr cuprins între 0 și RAND_MAX.

Pentru ca această funcție să funcționeze corect, înainte de a o utiliza, trebuie să inițializați generatorul de numere aleatoare cu funcția srand().

lcg_value()

Generator de numere pseudoaleatoare LCG (PHP 4, PHP 5)

Descriere:

Float lcg_value (void)

lcg_value() returnează un număr pseudoaleator în intervalul (0, 1). Funcția combină două generatoare cu 2^31 - 85 și 2^31 - 249 într-o perioadă.

mt_getrandmax()

Afișează cea mai mare valoare aleatorie posibilă (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Descriere:

Int mt_getrandmax (void)

Afișează valoarea maximă care poate fi returnată de mt_rand()

mt_rand()

Generează cea mai bună valoare aleatorie (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Descriere:

int mt_rand()

Multe versiuni mai vechi ale generatoarelor de numere aleatoare au caracteristici discutabile și sunt lente. În mod implicit, PHP folosește funcția rand() pentru a genera numere aleatorii. Funcția mt_rand() este un înlocuitor bun. Utilizează un generator de numere aleatoare care este de 4 ori mai rapid decât rand() și folosește Mersenne Twister.

Apelat fără argumentele opționale min și max, mt_rand() returnează o valoare pseudo-aleatorie cuprinsă între 0 și RAND_MAX. Dacă trebuie să obțineți, de exemplu, valori aleatorii între 5 și 15 inclusiv, căutați mt_rand (5, 15).

Exemplu de utilizare a mt_rand()

Rezultatul rulării acestui exemplu va fi cam așa:

1604716014
1478613278
6

cometariu

Notă: În versiunile anterioare 3.0.7, al doilea parametru al funcției specifica intervalul de numere. De exemplu, pentru a obține numere aleatoare între 5 și 15 în aceste versiuni trebuie să specificați funcția mt_rand(5, 11).

mt_srand()

Setează valoarea inițială a celui mai bun generator de numere aleatoare (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Descriere:

Void mt_srand()

Setează valoarea inițială a generatorului de numere aleatoare folosind semințe. Începând cu PHP 4.2.0, seed este opțional și setările implicite pentru valori aleatorii sunt omise.

Exemplu de utilizare a mt_srand()

Notă: Din PHP 4.2.0, nu mai este necesară inițializarea generatorului de numere aleatoare cu srand() sau mt_srand(), deoarece acest lucru se face acum automat.

Din punct de vedere tehnic, termenul „generator de numere aleatoare” este un nonsens, deoarece numerele în sine nu sunt aleatorii. De exemplu, 100 este un număr aleatoriu? Ce zici de 25? Ceea ce înseamnă de fapt acest termen este că creează o secvență de numere care apar aleatoriu. Acest lucru ridică o întrebare mai dificilă: ce este o succesiune de numere aleatoare? Singurul răspuns corect: o succesiune de numere aleatoare este o succesiune în care toate elementele nu au legătură. Această definiție duce la paradoxul că orice secvență poate fi fie aleatorie, fie non-aleatorie, în funcție de modul în care este obținută secvența. De exemplu, următorul șir de numere
1 2 3 4 5 6 7 8 9 0
a fost obținut prin tastarea liniei de sus a tastaturii în ordine, astfel încât secvența nu poate fi considerată generată aleatoriu. Dar ce se întâmplă dacă obții aceeași secvență când scoți mingile de tenis numerotate din butoi. În acest caz, este deja o secvență generată aleatoriu. Acest exemplu arată că aleatoritatea unei secvențe depinde de modul în care a fost obținută și nu de secvența în sine.

Amintiți-vă că o secvență de numere generată de computer este deterministă: fiecare număr, cu excepția primului, depinde de numerele dinainte. Din punct de vedere tehnic, aceasta înseamnă că doar o secvență cvasialeatorie de numere poate fi generată de un computer, adică. de fapt ele nu sunt cu adevărat aleatorii. Cu toate acestea, acest lucru este suficient pentru majoritatea sarcinilor și, pentru simplitate, astfel de secvențe vor fi numite aleatoare. O metodă foarte interesantă a fost dezvoltată de John von Neumann; este adesea numit rădăcină medie pătrată. În această metodă, numărul aleatoriu anterior este pătrat, iar apoi cifrele din mijloc sunt extrase din rezultat. De exemplu, dacă creați numere cu trei cifre, iar numărul anterior a fost 121, atunci la pătrarea rezultatului rezultă 14641. La pătratul celor trei cifre din mijloc dă următorul număr aleatoriu 464. Dezavantajul acestei metode este că are un perioadă de repetare foarte scurtă, numită ciclu. Din acest motiv, această metodă nu este folosită astăzi. Metodele moderne de generare a numerelor aleatoare sunt mult mai complexe.

Numere aleatorii în PHP

PHP are două grupuri de funcții pentru a lucra cu numere aleatoare. Pur extern, ele pot fi distinse prin prefixul mt_ pentru toate funcțiile unuia dintre grupuri.

Caracteristici depreciate
funcția rand Returnează un număr întreg între zero și valoarea lui RAND_MAX (care este 32767). Poate avea doi parametri întregi opționali - dacă sunt specificați, se generează un număr aleator de la primul parametru la al doilea.

Echo rand(); echo rand(1.100); // Dați un număr aleatoriu de la 1 la 100

Funcția srand. Specifică succesiunea de numere aleatoare produse de funcția rand. Are un parametru întreg - pentru diferite valori ale acestui parametru, rand va produce diferite secvențe de numere. Funcția srand trebuie apelată o singură dată înainte de toate apelurile la funcția rand. Exemplu de utilizare:

Srand(1288); // Inițializați generatorul de numere aleatoare pentru ($i=0; $i