Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akce až 50 % zdarma při nákupu e-learningu. Více informací:
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Slevovy týden 3/50

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:

Rand()
localhost

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

mt_rand()
localhost

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:

srand(6)
localhost

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.


 

Predchádzajúci článok
Zaokrúhľovania čísel v PHP
Všetky články v sekcii
PHP funkcie
Článok pre vás napísal Pavel Vaněček
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje psaní článků na Itnetwork.cz
Aktivity