Slučajni razlomci php. Generiše nasumični broj

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 ovog razloga ovu metodu danas se 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 - kada različita značenja Sa ovim parametrom, rand će proizvesti različite nizove brojeva. Funkciju srand treba pozvati samo jednom prije svih poziva funkcije rand. Primjer upotrebe:

Srand(1288); // Inicijaliziraj generator slučajnih brojeva za($i=0; $i= 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 izvršenja ovaj primjer bit će nešto 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()

Instalira početna vrijednost najbolji generator 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.

Zadatak
Morate generirati slučajni broj unutar numeričkog raspona.

Rješenje
Funkcija mt_rand() je dizajnirana za ovo:

// nasumični broj između $gornjeg i $donjeg, uključujući
$random_number = mt_rand($donji, $gornji);

Diskusija
Generisanje slučajnih brojeva je korisno kada trebate prikazati nasumične slike na ekranu, nasumično dodijeliti početnu tačku u igri, odabrati nasumični unos iz baze podataka ili generirati jedinstveni identifikator sesije. Da biste generirali nasumični broj u intervalu između dvije točke, trebate proslijediti dva argumenta funkciji mt_rand():

$random_number = mt_rand(1, 100);

Pozivanje mt_rand() bez argumenata vraća broj između nule i maksimalnog slučajnog broja koji vraća mt_getrandmax(). Kompjuteru je teško da generiše zaista nasumičan broj. Mnogo je bolji u metodičnom praćenju instrukcija i nije tako dobar ako se od njega zahtijeva da djeluje spontano. Ako trebate natjerati računar da proizvede nasumični broj, onda mu morate dati određeni skup ponovljivih naredbi, a sama činjenica ponovljivosti čini postizanje slučajnosti manje vjerojatnim.

PHP ima dva različita generatora slučajnih brojeva: klasičnu funkciju koja se zove rand() i više savršena funkcija mt_rand().

MT (Mersenne Twister) je generator pseudoslučajnih brojeva nazvan po francuskom monahu i matematičaru Marinu Mersenneu, koji je proučavao proste brojeve. Algoritam ovog generatora je baziran na ovim prostim brojevima. Funkcija mt_rand() je brža od funkcije rand() i proizvodi više nasumičnih brojeva, tako da preferiramo prvu.

Ako imate verziju PHP-a stariju od 4.2, tada prije pozivanja funkcije mt_rand() (ili rand()) po prvi put, trebate inicijalizirati generator s početnom vrijednošću pozivanjem mt_srand() (ili srand() )) funkcija. Početna vrijednost je broj koji slučajna funkcija koristi ga kao osnovu za generisanje slučajnih brojeva koje vraća; odnosi se na način da se riješi gore spomenuta dilema – ponovljivost naspram slučajnosti.

Kao početnu vrijednost koja se mijenja vrlo brzo i sa malom vjerovatnoćom ponovljivosti (ova svojstva bi trebala karakterizirati dobru početnu vrijednost), možete uzeti vrijednost koju vraća funkcija vremena visoke preciznosti microtime(). Dovoljno je jednom pokrenuti generator. PHP 4.2 i novije verzije automatski rukuju inicijalizacijom, ali ako je početna vrijednost postavljena ručno prije prvog poziva mt_rand(), PHP je ne zamjenjuje svojom vlastitom početnom vrijednošću.

Ako trebate odabrati nasumični zapis iz baze podataka, najlakši način je da prvo odredite ukupan broj polja u tablici, odaberete nasumični broj iz tog raspona, a zatim postavite upit za taj red iz baze podataka:

$sth = $dbh->query("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.

Zdravo svima! U ovom članku ćemo pogledati šta je novo za generisanje slučajnih brojeva u PHP 7.1.

Ovo ažuriranje je bilo nevidljivo programerima, ali je poboljšalo jezik PHP programiranje u polju generisanja slučajnih brojeva.

Koliko znamo, u PHP-u možemo koristiti funkciju rand(min, max) za generiranje slučajnih brojeva:

Echo rand(7, 17);

Ako sada osvježite stranicu, svaki put ćete dobiti novi nasumični broj.

Ali nije sve tako jednostavno kao što se čini. Poenta je da u zavisnosti od toga za šta generišete slučajni broj, funkcija rand() koristi različite sisteme generisanja. One. zavisi od sistema u kojem se koristi. Neki sistemi mogu koristiti slabe metode generiranja, tako da ćete dobiti brojeve koji nisu sasvim slučajni.

U PHP 7.1 ovaj problem je popravljen i dodana je funkcija mt_rand():

Echo mt_rand(7, 17);

Ova funkcija radi mnogo bolje, uključujući sigurnost. Ono što je takođe važno znati je da ako koristite funkciju rand() u PHP-u 7.1, ona će automatski biti prepisana od strane mt_rand() . One. rand() je sada samo pseudonim za mt_rand() .

Mnoge druge funkcije za generisanje slučajnih rezultata su poboljšane u PHP 7.1. Na primjer, pogledajmo kako možemo dobiti slučajnu vrijednost iz niza:

$names = ["Ivan", "Aleksandar", "Vasilij"];
echo $names;

One. sve funkcije poput ove su poboljšane kako bi se proizvele bolje nasumične brojeve u PHP 7.1. Da, ovo ažuriranje je prošlo nezapaženo, ali bez obzira na kojem jeziku pišete, vrlo je važno razumjeti šta se dešava unutar funkcije i kako se ona ponaša.

mob_info