Kant-en-klare php-code voor een willekeurige nummergenerator. Met behulp van de PHP-randomfunctie. Wachtwoordherstelscript

Hallo allemaal! In dit artikel zullen we kijken naar, wat is er nieuw voor het genereren van willekeurige getallen in PHP 7.1.

Deze update gebeurde onzichtbaar voor ontwikkelaars, maar verbeterde de programmeertaal PHP op het gebied van het genereren van willekeurige getallen.

Voor zover bekend is in PHP we kunnen de functie gebruiken rand(min, max) willekeurige getallen genereren:

Echorand(7, 17);

Als u nu de pagina ververst, ontvangt u iedere keer een nieuw willekeurig getal.

Maar niet alles is zo eenvoudig als het lijkt. Het punt is dat, afhankelijk van waarvoor je het willekeurige getal genereert, de functie rand() maakt gebruik van verschillende generatiesystemen. Die. het hangt af van het systeem waarin het wordt gebruikt. Sommige systemen gebruiken mogelijk zwakke generatiemethoden, waardoor u getallen ontvangt die niet geheel willekeurig zijn.

IN PHP 7.1 dit probleem is opgelost en er is een functie toegevoegd mt_rand():

Echo mt_rand(7, 17);

Deze functie werkt veel beter, inclusief beveiliging. Wat ook belangrijk is om te weten is dat als je de functie gebruikt rand() V PHP 7.1, waarna het automatisch wordt overschreven mt_rand(). Die. rand() nu slechts een alias voor mt_rand().

Veel andere functies voor het genereren van willekeurige resultaten zijn verbeterd PHP 7.1. Laten we bijvoorbeeld eens kijken hoe we een willekeurige waarde uit een array kunnen halen:

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

Die. alle functies zoals deze zijn verbeterd om betere willekeurige getallen te produceren PHP 7.1. Ja, deze update is onopgemerkt gebleven, maar in welke taal je ook schrijft, het is erg belangrijk om te begrijpen wat er binnen een functie gebeurt en hoe deze zich gedraagt.

Taak
U moet een willekeurig getal binnen een numeriek bereik genereren.

Oplossing
De functie mt_rand() is hiervoor ontworpen:

// willekeurig getal tussen $upper en $lower, inclusief
$random_number = mt_rand($lager, $upper);

Discussie
Het genereren van willekeurige getallen is handig wanneer u een willekeurige afbeelding op het scherm wilt weergeven, willekeurig een startpunt in een spel wilt toewijzen, een willekeurig item uit een database wilt selecteren of een unieke sessie-ID wilt genereren. Om een ​​willekeurig getal te genereren in het interval tussen twee punten, moet je twee argumenten doorgeven aan de functie mt_rand():

$willekeurig_getal = mt_rand(1, 100);

Het aanroepen van mt_rand() zonder argumenten retourneert een getal tussen nul en het maximale willekeurige getal dat wordt geretourneerd door mt_getrandmax(). Het is voor een computer moeilijk om een ​​echt willekeurig getal te genereren. Hij is veel beter in het methodisch opvolgen van instructies en is niet zo goed als hij spontaan moet handelen. Als je een computer wilt dwingen een willekeurig getal te produceren, moet je hem een ​​bepaalde reeks herhaalbare opdrachten geven, en juist het feit van herhaalbaarheid maakt het bereiken van willekeur minder waarschijnlijk.

PHP heeft twee verschillende generatoren voor willekeurige getallen: de klassieke functie genaamd rand() en de meer geavanceerde functie mt_rand().

MT (Mersenne Twister) is een generator voor pseudo-willekeurige getallen, genoemd naar de Franse monnik en wiskundige Marin Mersenne, die priemgetallen bestudeerde. Het algoritme van deze generator is gebaseerd op deze priemgetallen. De functie mt_rand() is sneller dan de functie rand() en produceert meer willekeurige getallen, dus wij geven de voorkeur aan de eerste.

Als je een versie van PHP ouder dan 4.2 hebt, moet je, voordat je de functie mt_rand() (of rand()) voor de eerste keer aanroept, de generator initialiseren met een initiële waarde door de mt_srand() (of srand() aan te roepen )) functie. Het zaad is het getal dat de willekeurige functie gebruikt als basis voor het genereren van de willekeurige getallen die het retourneert; het verwijst naar een manier om het hierboven genoemde dilemma op te lossen – herhaalbaarheid versus willekeur.

Als een beginwaarde die zeer snel verandert en met een lage waarschijnlijkheid van herhaalbaarheid (deze eigenschappen moeten worden gekenmerkt door een goede beginwaarde), kunt u de waarde nemen die wordt geretourneerd door de zeer nauwkeurige tijdfunctie microtime(). Het is voldoende om de generator één keer te initialiseren. PHP 4.2 en hoger handelt automatisch de initialisatie af, maar als de initiële waarde handmatig wordt ingesteld vóór de eerste aanroep van mt_rand(), vervangt PHP deze niet door zijn eigen initiële waarde.

Als u een willekeurig record uit een database moet selecteren, is de eenvoudigste manier om eerst het totale aantal velden in de tabel te bepalen, een willekeurig getal uit dat bereik te selecteren en vervolgens die rij uit de database te doorzoeken:

$sth = $dbh->query("SELECTEER AANTAL(*) ALS aantal UIT aanhalingstekens");
if ($rij = $sth->fetchRow()) (
$telling = $rij;
) anders (
die ($row->getMessage());
}
$random = mt_rand(0, $count - 1);
$sth = $dbh->query("SELECT quote FROM quotes LIMIT $random,1");
while ($rij = $sth->fetchRow()) (
druk $rij af.

"\N";
}

Dit codefragment bepaalt het totale aantal rijen in de tabel, genereert een willekeurig getal uit dat bereik en gebruikt vervolgens LIMIT $random,1 om één rij uit de tabel te SELECTEREN, beginnend op positie $random. In MySQL versie 3.23 of hoger is een alternatieve optie mogelijk:

$sth = $dbh->query("SELECTEER citaat UIT aanhalingstekens ORDER BY RAND() LIMIT 1");
while ($rij = $sth->fetchRow()) (
druk $rij af. "\N";
}

In dit geval randomiseert MySQL de rijen en retourneert vervolgens de eerste rij.

Initialiseert de generator voor willekeurige getallen. Syntaxis:

Leegte streng (int zaad)

Initialiseert de generator voor willekeurige getallen met de startwaarde.

Srand((dubbel) microtime()*1000000);
$ willekeurig = rand();
echo $willekeurig;

GETRANDMAX

Retourneert het grootst mogelijke willekeurige getal. Syntaxis:

Int getrandmax()

Deze functie retourneert de maximale waarde die kan worden verkregen met behulp van de functie voor het genereren van willekeurige getallen rand().

Meestal is dit 32767

Genereert een willekeurig getal. Syntaxis:

Int-rand()

Wanneer deze functie wordt aangeroepen met de optionele min- en max-parameters, genereert deze een willekeurig getal tot en met deze parameters. Als de min- en max-parameters ontbreken, wordt een getal tussen 0 en RAND_MAX geretourneerd.

Om deze functie correct te laten werken, moet u, voordat u deze gebruikt, de generator voor willekeurige getallen initialiseren met de functie srand().

lcg_waarde()

LCG pseudo-willekeurige nummergenerator (PHP 4, PHP 5)

Beschrijving:

Zwevende lcg_value (ongeldig)

lcg_value() retourneert een pseudowillekeurig getal in het bereik (0, 1). De functie combineert twee generatoren met 2^31 - 85 en 2^31 - 249 in een periode.

mt_gerandmax()

Toont de grootst mogelijke willekeurige waarde (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Beschrijving:

Int mt_getrandmax (ongeldig)

Toont de maximale waarde die kan worden geretourneerd door mt_rand()

mt_rand()

Genereert de beste willekeurige waarde (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Beschrijving:

int mt_rand()

Veel oudere versies van generatoren voor willekeurige getallen hebben twijfelachtige kenmerken en zijn traag. Standaard gebruikt PHP de functie rand() om willekeurige getallen te genereren. De functie mt_rand() is een goede vervanging. Het maakt gebruik van een generator voor willekeurige getallen die 4 keer sneller is dan rand() en maakt gebruik van Mersenne Twister.

Aangeroepen zonder de optionele min- en max-argumenten, retourneert mt_rand() een pseudo-willekeurige waarde variërend tussen 0 en RAND_MAX. Als je bijvoorbeeld willekeurige waarden tussen 5 en 15 wilt krijgen, zoek dan naar mt_rand (5, 15).

Voorbeeld van het gebruik van mt_rand()

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

echo mt_rand(5, 15);
?>

Het resultaat van het uitvoeren van dit voorbeeld zal ongeveer als volgt zijn:

1604716014
1478613278
6

Opmerking

Opmerking: In versies vóór 3.0.7 specificeerde de tweede parameter van de functie het bereik van getallen. Om in deze versies bijvoorbeeld willekeurige getallen tussen 5 en 15 te verkrijgen, moet u de functie mt_rand(5, 11) opgeven.

mt_srand()

Stelt de beginwaarde in van de beste generator voor willekeurige getallen (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Beschrijving:

Ongeldig mt_srand()

Stelt de beginwaarde van de generator voor willekeurige getallen in met behulp van zaad. Vanaf PHP 4.2.0 is Seed optioneel en zijn de standaardinstellingen voor willekeurige waarden weggelaten.

Voorbeeld van het gebruik van mt_srand()

// zaad met microseconden
functie make_seed()
{
list($usec, $sec) = explode(" ", microtime());
return (zwevend) $sec + ((zwevend) $usec * 100000);
}
mt_srand(make_seed());
$randval = mt_rand();
?>

Opmerking: Vanaf PHP 4.2.0 is het niet langer nodig om de generator voor willekeurige getallen te initialiseren met srand() of mt_srand(), omdat dit nu automatisch gebeurt.

Nu nemen we een kant-en-klare functie voor het genereren van wachtwoorden en schrijven we een script om een ​​nieuw wachtwoord voor gebruikers van uw site te herstellen of te maken.

Wachtwoordherstelscript

Hoe wordt het script meestal geschreven?

Zoals altijd wordt er een stappenplan opgesteld, wat we stap voor stap moeten doen. Alles gebeurt in één bestand, reminder.php

1. We voeren het script alleen uit als er een bepaalde variabele is, bijvoorbeeld $action;

2. Om het wachtwoordgeneratieproces te starten, specificeert de gebruiker het e-mailadres $_POST[`ema'l`]; Om de code te vereenvoudigen, wijzen we deze waarde toe aan de $email variabele.

3. Met behulp van reguliere expressies controleren we alle tekens om er zeker van te zijn dat de gebruiker het juiste e-mailadres heeft ingevoerd. Als dit niet het geval is, geven we een foutmelding weer en stoppen we het script. Als alles klopt, gaan we verder.

4. We zoeken in de database, in ons geval in de gebruikerstabel, naar een gebruiker met dit e-mailadres. Als dit niet het geval is, geven we een foutmelding dat er geen dergelijk adres in de database aanwezig is en stoppen we het script.

5. Er is een gebruiker met dit adres in de database, ga je gang en start de functie voor het genereren van een nieuw wachtwoord. Met behulp van het e-mailadres halen we ook de unieke ID van de gebruiker uit de database en schrijven deze naar de variabele $id;