Php willekeurig geheel getal. Genereert een willekeurig getal. Syntaxis

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, willekeurige invoer uit de database of genereer een unieke sessie-ID. 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 moet dwingen een willekeurig getal te produceren, dan 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: 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. Op deze priemgetallen en het algoritme is gebaseerd van deze generator. 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 dat hebt PHP-versie eerder dan 4.2, moet u, voordat u de functie mt_rand() (of rand()) voor de eerste keer aanroept, de generator initialiseren met een initiële waarde door de functie mt_srand() (of srand()) aan te roepen. De beginwaarde is het getal dat willekeurige functie gebruikt het als basis voor het genereren van de willekeurige getallen die het retourneert; het verwijst naar een manier om het bovengenoemde 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 of hoger latere versies voert 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 op te vragen:

$sth = $dbh->query("SELECTEER AANTAL(*) ALS aantal UIT aanhalingstekens");
if ($rij = $sth->fetchRow()) (
$telling = $rij;
) anders (
die ($row->getMessage());
}
$willekeurig = 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-versies 3.23 of hoger, een alternatieve optie is mogelijk:

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

In dit geval plaatst MySQL eerst de rijen willekeurige volgorde en retourneert vervolgens de eerste rij.

Technisch gezien is de term 'generator voor willekeurige getallen' onzin, aangezien getallen zelf niet willekeurig zijn. Is 100 bijvoorbeeld een willekeurig getal? Hoe zit het met 25? Wat deze term eigenlijk betekent, is dat er een reeks getallen ontstaat die willekeurig verschijnen. Dit roept een moeilijkere vraag op: wat is een reeks willekeurige getallen? Het enige juiste antwoord: een reeks willekeurige getallen is een reeks waarin alle elementen geen verband houden. Deze definitie leidt tot de paradox dat elke reeks willekeurig of niet-willekeurig kan zijn, afhankelijk van hoe de reeks wordt verkregen. Bijvoorbeeld, volgende regel cijfers
1 2 3 4 5 6 7 8 9 0
werd ontvangen door middel van afdrukken bovenste regel toetsenborden op volgorde, zodat de reeks niet als willekeurig gegenereerd kan worden beschouwd. Maar wat als je dezelfde volgorde krijgt als je de genummerde tennisballen uit de ton haalt? IN in dit geval dit is al een willekeurig gegenereerde reeks. Dit voorbeeld laat zien dat de willekeur van een reeks afhangt van de manier waarop deze is verkregen, en niet van de reeks zelf.

Bedenk dat een door de computer gegenereerde reeks getallen deterministisch is: elk getal, behalve het eerste, hangt af van de getallen ervoor. Technisch gezien betekent dit dat alleen een quasi-willekeurige reeks getallen door een computer kan worden gegenereerd, d.w.z. in feite zijn ze niet echt willekeurig. Dit is echter voldoende voor de meeste taken en voor de eenvoud zullen dergelijke reeksen willekeurig worden genoemd. Een zeer interessante methode werd ontwikkeld door John von Neumann; het wordt vaak het root mean square genoemd. Bij deze methode wordt het vorige willekeurige getal gekwadrateerd en worden vervolgens de middelste cijfers uit het resultaat gehaald. Als u bijvoorbeeld getallen maakt met drie cijfers en het vorige getal was 121, geeft kwadrateren het resultaat 14641. Het isoleren van de middelste drie cijfers levert het volgende willekeurige getal 464 op. Het nadeel van deze methode is dat deze een zeer korte herhalingsperiode, een zogenaamde cyclus. Om deze reden deze methode vandaag niet gebruikt. Moderne methoden Het genereren van willekeurige getallen is veel moeilijker.

Willekeurige getallen in PHP

PHP heeft twee groepen functies voor het werken met willekeurige getallen. Puur extern kunnen ze worden onderscheiden door het voorvoegsel mt_ voor alle functies van een van de groepen.

Verouderde functies
rand-functie Retourneert een geheel getal tussen nul en de waarde van RAND_MAX (dit is 32767). Kan twee optionele geheeltallige parameters hebben. Als deze zijn opgegeven, wordt er een willekeurig getal gegenereerd van de eerste parameter naar de tweede.

Echo-rand(); echorand(1.100); // Geef een willekeurig getal van 1 tot 100

Functie streng. Specificeert de reeks willekeurige getallen die door de randfunctie worden geproduceerd. Heeft een hele parameter - wanneer verschillende betekenissen Met deze parameter produceert rand verschillende reeksen getallen. De srand-functie hoeft slechts één keer te worden aangeroepen voordat alle oproepen naar de rand-functie plaatsvinden. Gebruiksvoorbeeld:

Srand(1288); // Initialiseer de generator voor willekeurige getallen voor($i=0; $i= 3.0.6, PHP 4, PHP 5)

Beschrijving:

Int mt_getrandmax (ongeldig)

Toont maximale waarde, die kan worden geretourneerd door de functie 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()

Het resultaat van executie dit voorbeeld er zal zoiets als dit 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 beste generator 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 de standaardinstelling voor willekeurige waarden dalen.

Voorbeeld van het gebruik van mt_srand()

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.