NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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:

Rand()
localhost

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í 0getrandmax(). 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:

mt_rand()
localhost

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:

srand(6)
localhost

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.


 

Předchozí článek
Zaokrouhlování čísel v PHP
Všechny články v sekci
PHP funkce
Přeskočit článek
(nedoporučujeme)
Kvíz - PHP funkce od A do Z
Článek pro vás napsal Pavel Vaněček
Avatar
Uživatelské hodnocení:
6 hlasů
Autor se věnuje psaní článků na Itnetwork.cz
Aktivity