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í.