Php nasumični broj od 1 do 10. Šta je novo u PHP7.1: generisanje slučajnih brojeva. Slučajni brojevi u JavaScriptu

Već su me nekoliko puta pitali kako pravim nasumične citate na svojoj web stranici u bloku "Pametni citati". Zatim sam uspeo da otkrijem da je problem u tome što ljudi ne razumeju kako da izlaze nasumični element iz niza u PHP-u. Zadatak je jednostavan, ali ipak, pošto se postavljaju pitanja, na njih se mora odgovoriti.

Odmah ću ti dati kod. Recimo da postoji niz sa skupom navodnika. I trebate odabrati jednu nasumično jednu od njih i ispisati:

Ključna stvar je dobijanje slučajnog broja. Sve što treba da uradite je da postavite prave granice. Ako trebate odabrati nasumični element preko cijele dužine niza, onda je on od 0 do (dužina niza minus 1). A onda jednostavno izvucite element iz niza sa rezultirajućim slučajnim indeksom.

Što se tiče zadatka sa navodnicima, bolje ih je pohraniti u bazu podataka. U principu, ako je stranica vrlo jednostavna, onda se to može učiniti u tekstualnoj datoteci. Ali ako je u bazi podataka, onda je bolje koristiti RAND() i LIMIT u SQL upitu tako da odmah dobijete jedan i nasumični citat iz baze podataka.

Za generiranje slučajnog broja, možete koristiti PHP rand() ili mt_rand() funkciju. Zahtjev za korištenjem slučajnih brojeva često se javlja u praksi za imenovanje varijabli, datoteka, kreiranje ključnih informacija i osiguranje sigurnosti.

Slučajnost i jedinstvenost

PHP random funkcija dolazi u dvije varijante: rand() i mt_rand(). Vjeruje se da je algoritam u prvom slučaju jednostavniji i generiše pseudoslučajne brojeve. Druga opcija ima brži algoritam i dobro poznate matematičke karakteristike. U većini slučajeva kada trebate dobiti nasumični broj, možete koristiti niz PHP nasumičnih poziva i dobiti jedinstvenu kombinaciju brojeva.

Ako za osnovu uzmete brojeve od 1 do 26 ili od 1 do 32 i dobijete ih nasumično, ključne informacije možete formirati kao niz latiničnih ili ćiriličkih slova. U ovom slučaju, PHP random je način generisanja niza abecednih informacija, na primjer za potrebe testiranja komunikacionih kanala ili algoritama.

Slučajni broj je rijetko jedinstven jer se može pojaviti više puta prema zakonu distribucije slučajne varijable. Ali ako kombinujete, posebno, statičku promenljivu PHP i Math.random jezika JavaScript, možete dobiti pravi jedinstveni slučajni broj koji se neće ponavljati tokom vremena.

Korištenje funkcije vremena

Funkcija vremena, i PHP i JavaScript, omogućava vam da formirate jedinstvene kombinacije brojeva, rijetko kada se u jednom trenutku može dogoditi dovoljno veliki broj događaja i slučajna varijabla će se ponoviti.

Primjenom PHP nasumice u rasponu od sekundi ili milisekundi u velikom rasponu mogućih vrijednosti, moguće je dobiti jedinstvene nasumične kombinacije brojeva ili slova. Šta još?

Kombinacijom vrijednosti vremenske funkcije, sekvencijalno rastućeg broja i PHP slučajnog odabira, možete osigurati pouzdanu sigurnost komunikacijskih kanala klijenta i servera, kreirati jedinstvene kodove za varijable i generirati nepredvidive događaje u algoritmima.

PHP generator slučajnih brojeva je odlično rješenje za većinu zadataka, posebno kada trebate brzo dobiti visokokvalitetne rezultate uz minimalan napor. Korištenje funkcija rand() i mt_rand u kombinaciji sa sekvencijalno rastućim nizom brojeva ili vremenskih vrijednosti omogućava vam da dobijete nasumične brojeve, koji se ponavljaju u vrijednostima i jedinstveni.

Inicijalizira generator slučajnih brojeva. sintaksa:

Void srand (int seed)

Inicijalizira generator slučajnih brojeva sa osnovnom vrijednošću.

Srand((double) microtime()*1000000);
$random = rand();
echo $random;

GETRANDMAX

Vraća najveći mogući slučajni broj. sintaksa:

Int getrandmax()

Ova funkcija vraća maksimalnu vrijednost koja se može dobiti korištenjem funkcije generiranja slučajnih brojeva rand().

Obično je 32767

Generiše nasumični broj. sintaksa:

Int rand()

Kada se pozove s opcijskim min i max parametrima, ova funkcija generiše nasumični broj do i uključujući te parametre. Ako nedostaju min i max parametri, vraća se broj u rasponu od 0 do RAND_MAX.

Da bi ova funkcija ispravno radila, prije korištenja, trebate inicijalizirati generator slučajnih brojeva s funkcijom srand().

lcg_value()

LCG generator pseudoslučajnih brojeva (PHP 4, PHP 5)

Opis:

Float lcg_value (void)

lcg_value() vraća pseudoslučajni broj u rasponu (0, 1). Funkcija kombinuje dva generatora sa 2^31 - 85 i 2^31 - 249 u periodu.

mt_getrandmax()

Prikazuje najveću moguću slučajnu vrijednost (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Opis:

Int mt_getrandmax (void)

Prikazuje maksimalnu vrijednost koju mt_rand() može vratiti

mt_rand()

Generira najbolju slučajnu vrijednost (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Opis:

int mt_rand()

Mnoge starije verzije generatora slučajnih brojeva imaju upitne karakteristike i spore su. PHP podrazumevano koristi funkciju rand() za generisanje slučajnih brojeva. Funkcija mt_rand() je dobra zamjena. Koristi generator slučajnih brojeva koji je 4 puta brži od rand() i koristi Mersenne Twister.

Pozvan bez opcionih argumenata min i max, mt_rand() vraća pseudo-slučajnu vrijednost u rasponu između 0 i RAND_MAX. Ako trebate dobiti, na primjer, nasumične vrijednosti između 5 i 15 uključujući, potražite mt_rand (5, 15).

Primjer korištenja mt_rand()

Rezultat pokretanja ovog primjera bit će otprilike ovako:

1604716014
1478613278
6

Komentar

Napomena: U verzijama prije 3.0.7, drugi parametar funkcije specificirao je raspon brojeva. Na primjer, da biste dobili nasumične brojeve između 5 i 15 u ovim verzijama morate navesti funkciju mt_rand(5, 11).

mt_srand()

Postavlja početnu vrijednost najboljeg generatora slučajnih brojeva (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Opis:

Void mt_srand()

Postavlja početnu vrijednost generatora slučajnih brojeva koristeći seed. Od PHP 4.2.0, seed je opciono i podrazumevane postavke za nasumične vrednosti su izostavljene.

Primjer korištenja mt_srand()

Napomena: Od PHP 4.2.0 više nije potrebno inicijalizirati generator slučajnih brojeva pomoću srand() ili mt_srand(), pošto se to sada radi automatski.

Tehnički, termin "generator slučajnih brojeva" je besmislica, jer sami brojevi nisu slučajni. Na primjer, da li je 100 slučajan broj? Šta je sa 25? Ono što ovaj izraz zapravo znači je da stvara niz brojeva koji se pojavljuju nasumično. Ovo postavlja teže pitanje: šta je niz slučajnih brojeva? Jedini tačan odgovor: niz slučajnih brojeva je niz u kojem svi elementi nisu povezani. Ova definicija dovodi do paradoksa da bilo koji niz može biti slučajan ili neslučajan, ovisno o tome kako se niz dobije. Na primjer, sljedeći niz brojeva
1 2 3 4 5 6 7 8 9 0
je dobijeno upisivanjem gornje linije tastature po redoslijedu, tako da se sekvenca ne može smatrati nasumično generiranom. Ali šta ako dobijete isti niz kada izvadite numerisane teniske loptice iz bureta. U ovom slučaju, to je već nasumično generirana sekvenca. Ovaj primjer pokazuje da slučajnost niza ovisi o tome kako je dobivena, a ne o samom nizu.

Zapamtite da je kompjuterski generisan niz brojeva deterministički: svaki broj osim prvog zavisi od brojeva ispred njega. Tehnički, to znači da samo kvazi-slučajni niz brojeva može generisati kompjuter, tj. u stvari, oni nisu zaista nasumični. Međutim, ovo je dovoljno za većinu zadataka i zbog jednostavnosti takve sekvence ćemo nazvati slučajnim. Jednu vrlo zanimljivu metodu razvio je John von Neumann; često se naziva srednji kvadrat. U ovoj metodi, prethodni slučajni broj se kvadrira, a zatim se iz rezultata izdvajaju srednje cifre. Na primjer, ako kreirate brojeve sa tri cifre, a prethodni broj je bio 121, tada kvadriranje rezultata daje rezultat 14641. Kvadriranje srednje tri cifre daje sljedeći slučajni broj 464. Nedostatak ove metode je što ima vrlo kratak period ponavljanja, koji se naziva ciklus. Iz tog razloga ova metoda se danas ne koristi. Moderne metode generiranja slučajnih brojeva su mnogo složenije.

Slučajni brojevi u PHP-u

PHP ima dvije grupe funkcija za rad sa slučajnim brojevima. Čisto eksterno, mogu se razlikovati po mt_ prefiksu za sve funkcije jedne od grupa.

Zastarjele funkcije
rand funkcija Vraća cijeli broj između nule i vrijednosti RAND_MAX (koja je 32767). Može imati dva opciona cjelobrojna parametra - ako su specificirani, generira se nasumični broj od prvog do drugog parametra.

Echo rand(); echo rand(1,100); // Dajte nasumični broj od 1 do 100

Funkcija srand. Određuje niz slučajnih brojeva koje proizvodi rand funkcija. Ima cijeli parametar - za različite vrijednosti ovog parametra, rand će proizvesti različite nizove brojeva. Funkciju srand treba pozvati samo jednom prije svih poziva funkcije rand. Primjer upotrebe:

Srand(1288); // Inicijalizirati generator slučajnih brojeva for($i=0; $iquery("SELECT COUNT(*) AS count FROM quotes");
if ($red = $sth->fetchRow()) (
$count = $red;
) drugo (
die ($row->getMessage());
}
$random = mt_rand(0, $broj - 1);
$sth = $dbh->query("IZABIR citata IZ LIMIT citata $random,1");
dok ($red = $sth->fetchRow()) (
print $row .

"\n";
}

Ovaj isječak koda određuje ukupan broj redova u tabeli, generiše nasumični broj iz tog opsega, a zatim koristi LIMIT $random,1 za SELECT jedan red iz tabele počevši od pozicije $random. U MySQL verziji 3.23 ili novijoj, moguća je alternativna opcija:

$sth = $dbh->query("IZABERITE citat IZ citata ORDER BY RAND() LIMIT 1");
dok ($red = $sth->fetchRow()) (
print $row . "\n";
}

U ovom slučaju, MySQL prvo randomizira redove, a zatim vraća prvi red.