Folosind funcția aleatoare PHP. Numere aleatorii

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, la întâmplare atribuiți un punct de plecare în joc, selectați intrare aleatorie din baza de date sau generați identificator unic sesiuni. 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 computerul să producă un număr aleatoriu, atunci trebuie să îl dați set specific comenzi repetate, în timp ce însuși faptul repetabilității face ca realizarea 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. Pe acestea numere prime iar algoritmul acestui generator se bazează. Funcția mt_rand() este mai rapidă decât funcția rand() și produce mai multe numere aleatorii, 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. Valoarea inițială este numărul care functie aleatorieîl folosește ca bază pentru generarea numerelor aleatoare pe care le returnează; se referă la o modalitate de a rezolva dilema menționată mai sus – repetabilitate versus aleatorie.

Ca valoare inițială care se modifică foarte repede și cu o probabilitate scăzută de repetabilitate (aceste proprietăți ar trebui să caracterizeze bine valoarea initiala), 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 sau mai mult versiuni 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 aleatoriu din acel interval și apoi utilizează LIMIT $random,1 pentru a SELECTA un rând din tabel începând cu poziția $random. În versiunea MySQL 3.23 sau mai recentă, 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.

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 informatie 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, statice variabilă PHP&Matematică.aleatorie limbaj JavaScript, atunci 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 se poate întâmpla suficient la un moment dat. un numar mare de evenimente ș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, sau puteți asigura securitatea de încredere a canalelor de comunicare client și server, creați coduri unice pentru variabile, generați 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 costuri minime. 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.

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, rândul următor numere
1 2 3 4 5 6 7 8 9 0
a fost primit prin tipar linia de sus tastaturile î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 în acest caz, aceasta 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ă pătrată medie. Î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ătrat dă rezultatul 14641. Izolarea celor trei cifre din mijloc dă următorul număr aleatoriu 464. Dezavantajul acestei metode este că are un perioadă scurtă de repetiție, numită ciclu. Din acest motiv aceasta metoda nefolosit astăzi. Metode moderne Generarea de numere aleatorii este mult mai dificilă.

Numere aleatoriiîn PHP

PHP are două grupuri de funcții pentru lucrul cu numere aleatorii. 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 - când sensuri diferite Cu acest 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= 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 aleatorii 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. Ea foloseste generator aleator numere, 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 executiei acest exemplu va fi ceva de genul asta:

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ă cel mai bun generator 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.