PHP je najlepší generátor náhodných čísel. Generujte náhodné čísla v rámci rozsahu. Použitie funkcie času

  • 03.11.2019

Technicky je pojem „generátor náhodných čísel“ absurdný, keďže samotné čísla nie sú náhodné. Je napríklad 100 náhodné číslo? A čo 25? Tento výraz v skutočnosti znamená, že sa vytvorí postupnosť čísel, ktoré sa objavujú náhodne. To vyvoláva zložitejšiu otázku: čo je to postupnosť náhodných čísel? Jediná správna odpoveď je: postupnosť náhodných čísel je postupnosť, v ktorej všetky prvky spolu nesúvisia. Táto definícia vedie k takému paradoxu, že akákoľvek sekvencia môže byť buď náhodná alebo nenáhodná, v závislosti od toho, ako sa táto sekvencia získa. Napríklad nasledujúci reťazec čísel
1 2 3 4 5 6 7 8 9 0
bola získaná napísaním horného riadku klávesnice v poradí, takže sekvenciu nemožno považovať za náhodne vygenerovanú. Ale čo keď získate rovnakú postupnosť tým, že zo suda vyberiete očíslované tenisové loptičky. V tomto prípade ide už o náhodne vygenerovanú sekvenciu. Tento príklad ukazuje, že náhodnosť sekvencie závisí od toho, ako bola získaná, a nie od nej samotnej.

Pamätajte, že postupnosť čísel vygenerovaných počítačom je deterministická: každé číslo, okrem prvého, závisí od predchádzajúcich čísel. Technicky to znamená, že počítač dokáže vygenerovať len kvázi náhodnú postupnosť čísel, t.j. v skutočnosti nie sú naozaj náhodné. Pre väčšinu problémov to však stačí a takéto sekvencie budeme pre jednoduchosť nazývať náhodné. Jednu veľmi zaujímavú metódu vyvinul John von Neumann; často sa označuje ako RMS. Pri tejto metóde sa predchádzajúce náhodné číslo odmocní a potom sa z výsledku extrahujú stredné číslice. Ak napríklad generujete čísla s tromi číslicami a predchádzajúce číslo bolo 121, výsledkom umocnenia je 14641. Extrahovaním prostredných troch číslic získate ďalšie náhodné číslo 464. Nevýhodou tejto metódy je, že má veľmi krátke opakovanie obdobie nazývané cyklus . Z tohto dôvodu sa dnes táto metóda nepoužíva. Moderné metódy na generovanie náhodných čísel sú oveľa komplikovanejšie.

Náhodné čísla v PHP

PHP má dve skupiny funkcií na prácu s náhodnými číslami. Navonok ich možno rozlíšiť predponou mt_ pre všetky funkcie jednej zo skupín.

Zastarané funkcie
funkcia rand. Vráti celé číslo od nuly do RAND_MAX (čo je 32767). Môže mať dva voliteľné celočíselné parametre - ak sú špecifikované, potom sa od prvého parametru po druhý generuje náhodné číslo.

echo rand(); echo rand(1 100); // Zadajte náhodné číslo od 1 do 100

funkcia srand. Určuje postupnosť náhodných čísel vrátených funkciou rand. Má celočíselný parameter - s rôznymi hodnotami tohto parametra rand vytvorí rôzne sekvencie čísel. Funkciu srand je potrebné zavolať iba raz, pred všetkými volaniami funkcie rand. Príklad použitia:

Srand(1288); // Inicializácia generátora náhodných čísel pre ($i=0; $i<5;$i++){ echo rand(); echo "
"; }

Pozor! Od PHP 4.2.0 nemusíte volať srand() – PHP to robí automaticky.
funkciou getrandmax(). Vráti hodnotu maximálneho náhodného čísla (32767).

Funkcie druhej skupiny (s predponou mt_)
Ich názvy a akcie sú podobné funkciám prvej skupiny – mt_rand, mt_srand a mt_getrandmax. Hlavný rozdiel je v tom, že náhodné čísla sú prevzaté zo širšieho rozsahu: od 0 do 2 19937 − 1. Navyše tieto funkcie fungujú oveľa rýchlejšie ako staršie náprotivky, pretože používajú generátor náhodných čísel Mersenne Twister, ktorý v roku 1997 vyvinuli japonskí vedci. Odtiaľ pochádza predpona mt_ (Mersenne Twister).
Príklad použitia:

// Vygenerovanie náhodného čísla od 1000 do 2000 echo mt_rand(1000, 2000);

Náhodné čísla v JavaScripte

Náhodné číslo v JavaScripte možno vygenerovať pomocou Math.random(). Bude to však zlomkové číslo medzi 0 a 1 (okrem 0 a 1). Ak chcete vygenerovať náhodné celé číslo v požadovanom rozsahu, musíte napísať vlastnú funkciu

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 a získať jedinečnú kombináciu čísel.

Ak vezmeme čísla od 1 do 26 alebo od 1 do 32 ako základ 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ť mnohokrá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 okamihu môže vyskytnúť dostatočne veľký počet udalostí a náhodná hodnota sa bude opakovať.

Aplikovaním PHP náhodného 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ú bezpečnosť 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 kombinácii 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é.

Vykonáva inicializáciu generátora náhodných čísel. Syntax:

void srand (int seed)

Inicializuje generátor náhodných čísel s počiatočnou hodnotou.

Srand((dvojitý) mikročas()*1000000);
$random = rand();
echo $random;

GETRANDMAX

Vráti najväčšie možné náhodné číslo. Syntax:

int getrandmax()

Táto funkcia vracia maximálnu hodnotu, ktorú možno získať pomocou funkcie generovania náhodných čísel rand().

Zvyčajne je to 32767

Vygeneruje náhodné číslo. Syntax:

Int rand(])

Pri volaní s voliteľnými parametrami min a max táto funkcia vygeneruje náhodné číslo, ktoré leží v rámci týchto parametrov vrátane. Ak parametre min a max chýbajú, vráti sa číslo medzi 0 a RAND_MAX.

Aby táto funkcia fungovala správne, pred jej použitím je potrebné inicializovať generátor náhodných čísel pomocou funkcie srand().

lcg_value()

Generátor pseudonáhodných čísel LCG (PHP 4, PHP 5)

Popis:

Float lcg_value(void)

lcg_value() vracia pseudonáhodné číslo v rozsahu (0, 1). Funkcia kombinuje dva generátory c 2^31 - 85 a 2^31 - 249 v perióde.

mt_getrandmax()

Zobrazuje najväčšiu možnú náhodnú hodnotu (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Popis:

int mt_getrandmax(void)

Zobrazuje maximálnu hodnotu, ktorú môže vrátiť funkcia mt_rand().

mt_rand()

Generuje najlepšiu náhodnú hodnotu (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Popis:

int mt_rand()

Mnohé staršie generátory náhodných čísel majú pochybný výkon a sú pomalé. PHP štandardne používa generátor náhodných čísel funkcie rand(). Funkcia mt_rand() je dobrou náhradou za ňu. Používa generátor náhodných čísel, ktorý je 4-krát rýchlejší ako rand() a používa Mersenne Twister.

Volaná bez voliteľných argumentov min a max, mt_rand() vracia pseudonáhodnú hodnotu medzi 0 a RAND_MAX. Ak potrebujete získať napríklad náhodné hodnoty medzi 5 a 15 vrátane, vyhľadajte mt_rand (5, 15).

príklad mt_rand().

echo mt_rand() . "\n";
echo mt_rand() . "\n";

echo mt_rand(5, 15);
?>

Výsledkom spustenia tohto príkladu bude niečo také:

1604716014
1478613278
6

Komentujte

Komentujte: Vo verziách pred 3.0.7 druhý parameter funkcie špecifikoval rozsah čísel. Napríklad, ak chcete získať náhodné čísla medzi 5 a 15, tieto verzie vyžadujú zadanie funkcie mt_rand(5, 11).

mt_srand()

Nastaví počiatočnú hodnotu najlepšieho generátora náhodných čísel (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Popis:

Void mt_srand()

Nastaví počiatočnú hodnotu generátora náhodných čísel pomocou seedu. Od PHP 4.2.0 je seed voliteľný a predvolené nastavenia pre náhodné hodnoty sú vynechané.

príklad mt_srand().

// semeno s mikrosekundami
funkcia make_seed()
{
zoznam($usec, $sec) = explode(" ", microtime());
return (float) $sec + ((float) $usec * 100000);
}
mt_srand(make_seed());
$randval = mt_rand();
?>

Komentujte: Počnúc PHP 4.2.0 už nie je potrebné inicializovať generátor náhodných čísel funkciami srand() alebo mt_srand(), pretože sa to teraz robí automaticky.

Ahojte všetci! 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é.

AT 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 vytvárali 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.

A teraz vezmeme pripravenú funkciu generovania hesla a napíšeme skript na obnovenie alebo vytvorenie nového hesla pre používateľov vašej stránky.

Skript na obnovenie hesla

Ako sa zvyčajne píše scenár?

Ako vždy je vypracovaná schéma krok za krokom, čo musíme urobiť krok za krokom. Všetko sa deje v jednom súbore pripomienky.php

1. Spustite skript iba vtedy, ak existuje určitá premenná, napríklad $action;

2. Na spustenie procesu generovania hesla používateľ zadá e-mailovú adresu $_POST[`ema‘l`]; Pre zjednodušenie kódu priraďme túto hodnotu premennej $email.

3. Pomocou regulárnych výrazov kontrolujeme všetky znaky, aby sme sa uistili, že používateľ správne zadal e-mailovú adresu. Ak nie, zobrazí sa chyba, zastavte skript. Ak je všetko správne, ideme ďalej.

4. Hľadáme do databázy, v našom prípade do tabuľky users, užívateľa s takouto poštovou adresou. Ak nie, vypíšeme chybu, že takáto adresa v databáze nie je a skript zastavíme.

5. V databáze je používateľ s takouto adresou, pokračujte a spustite funkciu generovania nového hesla. Taktiež na e-mailovej adrese získame jedinečné ID používateľa z databázy a zapíšeme ho do premennej $id;