26. diel - Generovanie náhodných čísel v PHP
V minulej lekcii, Zaokrúhľovania čísel v PHP , sme si ukázali funkcie pre zaokrúhľovanie čísel v PHP. Ukázali sme si funkcie ako floor (), ceil () či round ().
V tejto lekcii matematických funkcií si ukážeme funkcie, pomocou ktorých môžeme generovať náhodné čísla.
rand()
Keďže sme si v ukážkach základných goniometrických funkcií definovali
náhodný uhol pomocou funkcie rand(), tak si ju teraz poďme
vysvetliť. Funkcia rand() nám vygeneruje náhodné číslo v
zadanom rozmedzí (minimální hodnota, maximální hodnota)
zadanej ako parameter funkcie. Toto sú tiež jediné parametre a funkcie môže
byť volaná i bez nich. Ak nezadáme žiadny parameter, tak minimálna možná
hodnota náhodného čísla bude 0 a maximálnou podľa funkcie
getrandmax(), ktorá vráti najväčšiu možnú celočíselnú
hodnotu.
U niektorých platforiem (ako napríklad 64-bit
Windows) je maximálna hodnota funkcie
getrandmax() rovná 2 147 483 647 (2 31
-1), minimálna garantovaná je 32767 (to bývalo maximum na 16-bit systémoch).
Maximálna hodnota sa však odvíja od použitých knižníc jazyka C, v ktorom je PHP naprogramované.
Poďme si ukázať nejaký ten príklad:
echo rand(); echo rand(); echo rand(-10, 30);
Na výstup dostaneme napríklad tieto hodnoty:
mt_rand()
Funkcia mt_rand () podobne ako rand() generuje
náhodné čísla v zadanom rozmedzí. Čísla sú generované pomocou
Mersenne Twister Random Number generátora. Funkcia prijíma dva
parametre a to hodnoty minimálnej a maximálnej medze. Ukážme si
príklady:
echo mt_rand()."<br/>"; echo mt_rand(0, 5);
Ak vypíšeme funkciu mt_rand() bez parametrov, dostaneme na
výstup náhodnú hodnotu v rozmedzí 0 až
getrandmax(). Pridáme Ak minimálnu a maximálnu hranicu, budeme
dostávať čísla v zadanom intervale. Na výstup môžeme dostať napríklad
toto:
srand()
Funkcia srand() nám definuje tzv. Seed (v
doslovnom slovenskom preklade semienka) pre generovanie
náhodných čísel. To môžete poznať potrebné pri generovaní svetov v hre
Minecraft. Seed v oblasti generovania náhodných čísel znamená počiatočný
bod, od ktorého počítač generuje náhodnú sekvenciu čísiel. Seed je
celočíselná hodnota a tiež je jediným parametrom, ktorý táto funkcia
prijíma. Ukážme si príklady:
srand(time()); // díky funkci time() se vygeneruje seed podle aktuálního času echo rand();
Môžeme si všimnúť, že funkciu srand() nevypisuje na
obrazovku pomocou funkcie echo(), ale iba ju zavoláme so zadanou
seed hodnotou. Funkcia rand() nám zakaždým
vráti náhodnú hodnotu v závislosti na definovanom seedu, ktorý sa
nemení:
srand(6); echo rand();
Výsledok bude v tomto prípade vždy 1917402565:
V tomto príklade sa seed definované vo funkcii srand() mení
podľa návratovej hodnoty funkcie time(), ktorou je aktuálna
časová známka, angl. timestamp. Tu pri každom výpise na
obrazovku bude hodnota funkcie rand() náhodná.
Funkcia srand() je od PHP verzie
7.1.0 aliasom funkcie mt_srand()
mt_srand()
Funkcia mt_srand() rovnako ako funkcia srand()
definuje seed pre generovanie náhodných čísel. Na rozdiel od
srand() tu pribudol ďalší parameter, ktorým môžeme
špecifikovať algoritmus pre generovanie náhodných čísel. Máme na výber z
týchto algoritmov:
- MT_RAND_MT19937 - správna (opravená) Mersenne Twisterova implementácia algoritmu (dostupná od verzie PHP 7.1.0)
- MT_RAND_PHP - nesprávna Mersenne Twisterova implementácia algoritmu, ktorá bola používaná do PHP verzie 7.1.0. Tento mód, hoci chybný, zostal v PHP vzhľadom k spätnej kompatibilite.
Ukážme si príklad:
mt_srand(5, MT_RAND_MT19937); echo(rand());
V tomto príklade dostaneme na výstup vždy hodnotu 476726705.
PHP pre generovanie čísel automaticky používa opravenú verziu Mersenne
Twisterova algoritmu.
mt_srand(5, MT_RAND_PHP); echo(rand());
Ak však použijeme chybnú implementáciu Mersenne Twisterova algoritmu,
dostaneme na výstup hodnotu 1663152327.
getrandmax()
Funkcia getrandmax() nám vráti najväčšiu možnú náhodnú
hodnotu. Táto funkcia nemá žiadne parametre a je väčšinou volaná
spoločne s funkciou rand(), ak nezadáme žiadne parametre.
Ukážme si príklad:
echo(getrandmax());
Na výstup dostaneme maximálne číslo pre generovanie náhodné hodnoty
2147483647.
mt_getrandmax()
Rovnako tak funkcie mt_getrandmax() nám vráti najväčšiu
možnú náhodnú hodnotu podľa Mersenne Twister algoritmu. Nemá
žiadne parametre a je väčšinou volaná spoločne s funkciou
mt_rand():
echo(mt_getrandmax());
Na výstup dostaneme maximálne číslo pre generovanie náhodné hodnoty,
čiže na 64-bit Windows hodnotu 2147483647.
V nasledujúcom kvíze, Kvíz - Goniometria, Eulerovo číslo a logaritmy v PHP, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.
