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.