Lekce 26 - Generování náhodných čísel v PHP
V minulé lekci, Zaokrouhlování čísel v PHP, jsme si ukázali funkce pro zaokrouhlování čísel v PHP. Ukázali jsme si funkce jako floor(), ceil() či round().
V této lekci matematických funkcí si ukážeme funkce, pomocí kterých můžeme generovat náhodná čísla.
rand()
Jelikož jsme si v ukázkách základních goniometrických funkcí
definovali náhodný úhel pomocí funkce rand(), tak si ji nyní
pojďme vysvětlit. Funkce rand() nám vygeneruje náhodné číslo
v zadaném rozmezí (minimální hodnota, maximální hodnota)
zadané jako parametr funkce. Toto jsou také jediné parametry a funkce může
být volána i bez nich. Pokud nezadáme žádný parametr, tak minimální
možná hodnota náhodného čísla bude 0 a maximální dle funkce
getrandmax(), která vrátí největší možnou celočíselnou
hodnotu.
U některých platforem (jako třeba
64-bit Windows) je maximální hodnota funkce
getrandmax() rovna 2 147 483 647 (231
-1), minimální garantovaná je 32767 (to bývalo maximum na 16-bit
systémech). Maximální hodnota se však odvíjí od použitých knihoven
jazyka C, v kterém je PHP naprogramováno.
Pojďme si ukázat nějaký ten příklad:
echo rand(); echo rand(); echo rand(-10, 30);
Na výstup dostaneme například tyto hodnoty:
mt_rand()
Funkce mt_rand() podobně jako rand() generuje
náhodná čísla v zadaném rozmezí. Čísla jsou generována pomocí
Mersenne Twister Random Number generátoru. Funkce přijímá dva
parametry a to hodnoty minimální a maximální meze. Ukažme si
příklady:
echo mt_rand()."<br/>"; echo mt_rand(0, 5);
Pokud vypíšeme funkci mt_rand() bez parametrů, dostaneme na
výstup náhodnou hodnotu v rozmezí 0 až
getrandmax(). Přidáme-li minimální a maximální mez, budeme
dostávat čísla v zadaném intervalu. Na výstup můžeme dostat například
toto:
srand()
Funkce srand() nám definuje tzv. seed (v
doslovném českém překladu semínka) pro generování
náhodných čísel. To můžete znát třeba při generování světů ve hře
Minecraft. Seed v oblasti generování náhodných čísel znamená
počáteční bod, od kterého počítač generuje náhodnou sekvenci čísel.
Seed je celočíselná hodnota a také je jediným parametrem, který tato
funkce přijímá. Ukažme si příklady:
srand(time()); // díky funkci time() se vygeneruje seed podle aktuálního času echo rand();
Můžeme si všimnout, že funkci srand() nevypisujeme na
obrazovku pomocí funkce echo(), ale pouze ji zavoláme se zadanou
seed hodnotou. Funkce rand() nám pokaždé
vrátí náhodnou hodnotu v závislosti na definovaném seedu, který se
nemění:
srand(6); echo rand();
Výsledek bude v tomto případě vždy 1917402565:
V tomto příkladu se seed definované ve funkci srand() mění
podle návratové hodnoty funkce time(), kterou je aktuální
časová známka, angl. timestamp. Zde při každém výpisu na
obrazovku bude hodnota funkce rand() náhodná.
Funkce srand() je od PHP verze
7.1.0 aliasem funkce mt_srand()
mt_srand()
Funkce mt_srand() stejně jako funkce srand()
definuje seed pro generování náhodných čísel. Na rozdíl od
srand() zde přibyl další parametr, kterým můžeme specifikovat
algoritmus pro generování náhodných čísel. Máme na výběr z těchto
algoritmů:
- MT_RAND_MT19937 - správná (opravená) Mersenne Twisterova implementace algoritmu (dostupná od verze PHP 7.1.0)
- MT_RAND_PHP - nesprávná Mersenne Twisterova implementace algoritmu, která byla používána do PHP verze 7.1.0. Tento mód, ač chybný, zůstal v PHP vzhledem k zpětné kompatibilitě.
Ukažme si příklad:
mt_srand(5, MT_RAND_MT19937); echo(rand());
V tomto příkladu dostaneme na výstup vždy hodnotu 476726705.
PHP pro generování čísel automaticky používá opravenou verzi Mersenne
Twisterova algoritmu.
mt_srand(5, MT_RAND_PHP); echo(rand());
Pokud však použijeme chybnou implementaci Mersenne Twisterova algoritmu,
dostaneme na výstup hodnotu 1663152327.
getrandmax()
Funkce getrandmax() nám vrátí největší možnou náhodnou
hodnotu. Tato funkce nemá žádné parametry a je většinou volána společně
s funkcí rand(), pokud nezadáme žádné parametry. Ukažme si
příklad:
echo(getrandmax());
Na výstup dostaneme maximální číslo pro generování náhodné hodnoty
2147483647.
mt_getrandmax()
Stejně tak funkce mt_getrandmax() nám vrátí největší
možnou náhodnou hodnotu podle Mersenne Twister algoritmu. Nemá
žádné parametry a je většinou volána společně s funkcí
mt_rand():
echo(mt_getrandmax());
Na výstup dostaneme maximální číslo pro generování náhodné hodnoty,
čili na 64-bit Windows hodnotu 2147483647.
V následujícím kvízu, Kvíz - PHP funkce od A do Z, si vyzkoušíme nabyté zkušenosti z kurzu.

