PHP generátor náhodných čísel. Pomocou PHP náhodného. Náhodné čísla v PHP

  • 20.06.2020

Ahoj! V tomto článku sa pozrieme na čo je nové pre generovanie náhodných čísel v PHP 7.1.

Táto aktualizácia sa stala vývojárom neviditeľne, ale zlepšila programovací jazyk PHP v oblasti generovania náhodných čísel.

Pokiaľ je známe, v PHP môžeme použiť funkciu rand (min, max) na generovanie náhodných čísel:

echo rand(7, 17);

Ak teraz obnovíte stránku, zakaždým dostanete nové náhodné číslo.

Ale nie všetko je také jednoduché, ako by sa mohlo zdať. Ide o to, že funkcia závisí od toho, na čo generujete náhodné číslo rand() používa rôzne generačné systémy. Tie. závisí od systému, v ktorom sa používa. Niektoré systémy môžu používať slabé metódy generovania, takže získate čísla, ktoré nie sú úplne náhodné.

IN PHP 7.1 tento problém bol vyriešený a bola pridaná funkcia mt_rand():

echo mt_rand(7, 17);

Táto funkcia funguje oveľa lepšie, vrátane zabezpečenia. Dôležité je vedieť aj to, že ak funkciu používate rand() v PHP 7.1, potom sa automaticky prepíše mt_rand(). Tie. rand() teraz len alias pre mt_rand().

Mnoho ďalších funkcií na získanie náhodných výsledkov bolo vylepšených PHP 7.1. Pozrime sa napríklad, ako môžeme získať náhodnú hodnotu z poľa:

$names = ["Ivan", "Alexander", "Vasiliy"];
echo $names;

Tie. všetky funkcie, ako je táto, boli vylepšené, aby produkovali lepšie náhodné čísla PHP 7.1. Áno, táto aktualizácia zostala nepovšimnutá, ale bez ohľadu na jazyk, v ktorom píšete, je veľmi dôležité pochopiť, čo sa deje vo vnútri funkcie a ako sa správa.

Na vygenerovanie náhodného čísla môžete použiť funkciu PHP rand() alebo mt_rand(). Požiadavka na používanie náhodných čísel sa v praxi často objavuje pri pomenovaní premenných, súborov, vytváraní kľúčových informácií a zaistení bezpečnosti.

Náhodnosť a jedinečnosť

Náhodná funkcia PHP prichádza v dvoch variantoch: rand() a mt_rand(). Predpokladá sa, že algoritmus v prvom prípade je jednoduchší a generuje pseudonáhodné čísla. Druhá možnosť má rýchlejší algoritmus a známe matematické charakteristiky. Vo väčšine prípadov, keď potrebujete získať náhodné číslo, môžete použiť sériu náhodných volaní PHP na získanie jedinečnej kombinácie čísel.

Ak vezmeme ako základ čísla od 1 do 26 alebo od 1 do 32 a získame ich náhodne, potom môžeme vytvoriť kľúčové informácie ako postupnosť písmen latinky alebo cyriliky. V tomto prípade je PHP random spôsob, ako generovať sekvenciu abecedných informácií, napríklad na účely testovania komunikačných kanálov alebo algoritmov.

Náhodné číslo je zriedkavo jedinečné, pretože sa môže objaviť viackrát podľa zákona o rozdelení náhodnej premennej. Ale ak skombinujete najmä statickú premennú PHP & Math.random jazyka JavaScript, potom môžete získať skutočné jedinečné náhodné číslo, ktoré sa nebude v čase opakovať.

Použitie funkcie času

Časová funkcia, PHP aj JavaScript, vám umožňuje vytvárať jedinečné kombinácie čísel, len zriedka, keď sa v jednom časovom bode môže vyskytnúť dostatočne veľký počet udalostí a náhodná hodnota sa bude opakovať.

Aplikovaním PHP náhodne v rozsahu sekúnd alebo milisekúnd, so širokým rozsahom možných hodnôt, môžete získať jedinečné náhodné kombinácie čísel alebo písmen. Čo ešte?

Kombináciou hodnoty časovej funkcie, neustále rastúceho počtu a náhodného PHP alebo môžete zaistiť spoľahlivé zabezpečenie komunikačných kanálov klienta a servera, vytvárať jedinečné kódy pre premenné a generovať nepredvídateľné udalosti v algoritmoch.

PHP generátor náhodných čísel je skvelým riešením pre väčšinu úloh, najmä ak potrebujete rýchlo získať vysokokvalitné výsledky s minimálnymi nákladmi. Používanie funkcií rand() a mt_rand v spojení s postupne rastúcimi sériami čísel alebo časových hodnôt vám umožňuje získať náhodné čísla, ktoré sa opakujú v hodnotách a sú jedinečné.

Úloha
Musíte vygenerovať náhodné číslo v rámci číselného rozsahu.

Riešenie
Funkcia mt_rand() je určená na to:

// náhodné číslo medzi $upper a $lower, vrátane
$náhodné_číslo = mt_rand($dolné, $horné);

Diskusia
Generovanie náhodných čísel je užitočné, keď potrebujete zobraziť náhodný obrázok na obrazovke, priradiť náhodný počiatočný bod v hre, vybrať náhodný záznam z databázy alebo vygenerovať jedinečné ID relácie. Aby bolo možné vygenerovať náhodné číslo medzi dvoma bodmi, musia byť funkcii mt_rand() odovzdané dva argumenty:

$náhodné_číslo = mt_rand(1, 100);

Volanie funkcie mt_rand() bez argumentov vráti číslo medzi nulou a maximálnym náhodným číslom vráteným funkciou mt_getrandmax(). Pre počítač je ťažké vygenerovať skutočne náhodné číslo. Oveľa lepšie zvláda metodické pokyny a nie je taký dobrý, keď sa od neho vyžaduje spontánna činnosť. Ak chcete, aby počítač vydal náhodné číslo, musíte mu dať určitú množinu opakovateľných príkazov, pričom samotná skutočnosť opakovateľnosti znižuje pravdepodobnosť dosiahnutia náhodnosti.

PHP má dva rôzne generátory náhodných čísel: klasickú funkciu s názvom rand() a pokročilejšiu funkciu mt_rand().

MT (Mersenne Twister) je generátor pseudonáhodných čísel pomenovaný po francúzskom mníchovi a matematikovi Marinovi Mersennovi, ktorý skúmal prvočísla. Algoritmus tohto generátora je založený na týchto prvočíslach. Funkcia mt_rand() je rýchlejšia ako funkcia rand() a produkuje viac náhodných čísel, preto dávame prednosť prvej.

Ak máte verziu PHP staršiu ako 4.2, potom pred prvým volaním funkcie mt_rand() (alebo rand()) musíte inicializovať generátor s počiatočnou hodnotou volaním funkcie mt_srand() (alebo srand( )) funkciu. Počiatočná hodnota je číslo, ktoré náhodná funkcia používa ako základ na generovanie náhodných čísel, ktoré vracia; ide o spôsob riešenia vyššie uvedenej dilemy - opakovanie verzus náhodnosť.

Ako počiatočnú hodnotu, ktorá sa mení veľmi rýchlo a s malou šancou na opakovateľnosť (toto sú vlastnosti, ktorými by sa mala vyznačovať dobrá počiatočná hodnota), môžete vziať hodnotu vrátenú časovou funkciou microtime() s vysokou presnosťou. Generátor stačí inicializovať raz. PHP 4.2 a novšie automaticky spracováva inicializáciu, ale ak je počiatočná hodnota nastavená manuálne pred prvým volaním funkcie mt_rand(), potom ju PHP nenahrádza vlastnou počiatočnou hodnotou.

Ak potrebujete vybrať náhodný záznam z databázy, potom najjednoduchším spôsobom je najprv určiť celkový počet polí v tabuľke, vybrať náhodné číslo z tohto rozsahu a potom dotazovať tento riadok z databázy:

$sth = $dbh->query("VYBERTE POČET(*) AKO pocet Z úvodzoviek");
if ($row = $sth->fetchRow()) (
$pocet = $riadok;
) inak (
die($row->getMessage());
}
$random = mt_rand(0, $počet - 1);
$sth = $dbh->query("VYBRAŤ citát FROM úvodzoviek LIMIT $náhodný,1");
while ($row = $sth->fetchRow()) (
vytlačiť $riadok .

"\n";
}

Tento kúsok kódu určí celkový počet riadkov v tabuľke, vygeneruje náhodné číslo z tohto rozsahu a potom použije LIMIT $ náhodne,1 na VÝBER jedného riadku z tabuľky, počnúc od pozície $ náhodne. Vo verzii MySQL 3.23 alebo vyššej je možná alternatíva:

$sth = $dbh->query("VYBRAŤ citát Z úvodzoviek ORDER BY RAND() LIMIT 1");
while ($row = $sth->fetchRow()) (
vytlačiť $riadok . "\n";
}

V tomto prípade MySQL najprv náhodne usporiada riadky a potom vráti prvý riadok.

Párkrát sa ma pýtali, ako to robím náhodný výstup úvodzoviek na vašej stránke v bloku " Inteligentné ponukyĎalej sa mi podarilo zistiť, že problém je tu v nepochopení ľudí, ako získať náhodný prvok z poľa v php. Úloha je jednoduchá, no napriek tomu, keďže vznikajú otázky, je potrebné na ne odpovedať.

Hneď vám dám kód. Povedzme, že existuje pole so sadou úvodzoviek. A musíte si vybrať jeden náhodný z nich a výstup:

$úvodzovky = pole(); // Inicializuje prázdne pole
$quotes = "Buďte pozorní na svoje myšlienky, sú začiatkom činov."; // Prvý citát
$quotes = "Nie najchytrejší alebo najsilnejší prežijú, ale tí, ktorí sú najviac vnímaví k zmenám."; // Druhý citát
$quotes = "Život je hora: pomaly stúpaj, rýchlo klesáš."; // Tretí citát
$quotes = "Ľudia nechcú byť bohatí, ľudia chcú byť bohatší ako ostatní."; // Štvrtý citát
$číslo = mt_rand(0, počet($úvodzovky) - 1); // Vezmite náhodné číslo od 0 do (dĺžka poľa mínus 1) vrátane
echo $citáty[$číslo]; // Výstupná ponuka
?>

Kľúčovým bodom je získanie náhodného čísla. Stačí, ak si nastavíte správne hranice. Ak potrebujete vybrať náhodný prvok po celej dĺžke poľa, potom je to z 0 predtým ( dĺžka poľa mínus 1). A potom už len vytiahnuť prvok z poľa s daným náhodným indexom.

Pokiaľ ide o úlohu s úvodzovkami, je lepšie ich uložiť do databázy. V zásade, ak je stránka veľmi jednoduchá, potom je to možné v textovom súbore. Ale ak v databáze, potom je lepšie použiť RAND() A LIMIT v SQL dotaz aby ste okamžite dostali jedinú a náhodnú cenovú ponuku z databázy.